diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/InstructionsUnfolder.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/InstructionsUnfolder.kt index 8f671e7ca57..7eab2586d6c 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/InstructionsUnfolder.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/InstructionsUnfolder.kt @@ -194,15 +194,14 @@ private fun unfoldValueParameters(expression: IrFunctionAccessExpression, callSt private fun unfoldInstanceInitializerCall(instanceInitializerCall: IrInstanceInitializerCall, callStack: CallStack) { val irClass = instanceInitializerCall.classSymbol.owner + val toInitialize = irClass.declarations.filter { it is IrProperty || (it is IrAnonymousInitializer && !it.isStatic) } - // init blocks processing - val anonymousInitializer = irClass.declarations.filterIsInstance().filter { !it.isStatic } - anonymousInitializer.reversed().forEach { callStack.addInstruction(CompoundInstruction(it.body)) } - - // properties processing - val classProperties = irClass.declarations.filterIsInstance() - classProperties.filter { it.backingField?.initializer?.expression != null }.reversed() - .forEach { callStack.addInstruction(CompoundInstruction(it.backingField)) } + toInitialize.reversed().forEach { + when { + it is IrAnonymousInitializer -> callStack.addInstruction(CompoundInstruction(it.body)) + it is IrProperty && it.backingField?.initializer?.expression != null -> callStack.addInstruction(CompoundInstruction(it.backingField)) + } + } } private fun unfoldField(field: IrField, callStack: CallStack) { 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 1e28f9d2974..62a85c6b590 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 @@ -424,14 +424,17 @@ class IrInterpreter(internal val environment: IrInterpreterEnvironment, internal valueArguments.forEachIndexed { index, irConst -> enumSuperCall.putValueArgument(index, irConst) } } - val enumConstructorCall = enumEntry.initializerExpression?.expression as? IrEnumConstructorCall + val enumInitializer = enumEntry.initializerExpression?.expression ?: throw InterpreterError("Initializer at enum entry ${enumEntry.fqNameWhenAvailable} is null") + val enumConstructorCall = enumInitializer as? IrEnumConstructorCall + ?: (enumInitializer as IrBlock).statements.filterIsInstance().single() + val enumClassObject = Variable(enumConstructorCall.getThisReceiver(), Common(enumEntry.correspondingClass ?: enumClass)) environment.mapOfEnums[enumEntry.symbol] = enumClassObject.state as Complex callStack.newSubFrame(enumEntry) callStack.addInstruction(CustomInstruction(cleanEnumSuperCall)) - callStack.addInstruction(CompoundInstruction(enumConstructorCall)) + callStack.addInstruction(CompoundInstruction(enumInitializer)) callStack.addVariable(enumClassObject) } }