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