From 13f7b6a22eb8578f0e34f22be8b27027519f9ad7 Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Fri, 26 Jun 2020 17:59:06 +0300 Subject: [PATCH] Create separate constructor for ir interpreter with only ir builtins By introducing this constructor, ir interpreter will no longer find ir exceptions in module and so interpreter is creating faster for fir2ir goals --- .../fir/backend/evaluate/IrConstTransformer.kt | 7 ++++--- .../kotlin/ir/interpreter/IrInterpreter.kt | 16 ++++++++++++---- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/evaluate/IrConstTransformer.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/evaluate/IrConstTransformer.kt index f48e75c2faf..b8bb0bd5c97 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/evaluate/IrConstTransformer.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/evaluate/IrConstTransformer.kt @@ -11,18 +11,19 @@ import org.jetbrains.kotlin.ir.interpreter.IrInterpreter import org.jetbrains.kotlin.ir.interpreter.toIrConst import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.declarations.* +import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid fun evaluateConstants(irModuleFragment: IrModuleFragment) { - val irConstTransformer = IrConstTransformer(irModuleFragment) + val irConstTransformer = IrConstTransformer(irModuleFragment.irBuiltins) irModuleFragment.files.forEach { it.transformChildren(irConstTransformer, null) } } //TODO create abstract class that will be common for this and lowering -class IrConstTransformer(irModuleFragment: IrModuleFragment) : IrElementTransformerVoid() { - private val interpreter = IrInterpreter(irModuleFragment) +class IrConstTransformer(irBuiltIns: IrBuiltIns) : IrElementTransformerVoid() { + private val interpreter = IrInterpreter(irBuiltIns) private fun IrExpression.replaceIfError(original: IrExpression): IrExpression { return if (this !is IrErrorExpression) this else original diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/IrInterpreter.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/IrInterpreter.kt index e3d479d12c1..3dc8134d893 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/IrInterpreter.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/IrInterpreter.kt @@ -18,6 +18,7 @@ import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl import org.jetbrains.kotlin.ir.declarations.lazy.IrLazyFunction +import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.IrConstructorCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrErrorExpressionImpl @@ -32,10 +33,8 @@ import kotlin.concurrent.thread private const val MAX_COMMANDS = 500_000 -class IrInterpreter(irModule: IrModuleFragment, private val bodyMap: Map = emptyMap()) { - private val irBuiltIns = irModule.irBuiltins - private val irExceptions = irModule.files.flatMap { it.declarations }.filterIsInstance() - .filter { it.isSubclassOf(irBuiltIns.throwableClass.owner) } +class IrInterpreter(private val irBuiltIns: IrBuiltIns, private val bodyMap: Map = emptyMap()) { + private val irExceptions = mutableListOf() private val stack = StackImpl() private var commandCount = 0 @@ -43,6 +42,15 @@ class IrInterpreter(irModule: IrModuleFragment, private val bodyMap: Map() private val mapOfObjects = mutableMapOf() + constructor(irModule: IrModuleFragment): this(irModule.irBuiltins) { + irExceptions.addAll( + irModule.files + .flatMap { it.declarations } + .filterIsInstance() + .filter { it.isSubclassOf(irBuiltIns.throwableClass.owner) } + ) + } + private fun Any?.getType(defaultType: IrType): IrType { return when (this) { is Boolean -> irBuiltIns.booleanType