From 3ccf542b38482db9ce801ea162faa17594c84b56 Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Tue, 28 Jan 2020 19:07:30 +0300 Subject: [PATCH] Rework object and companion object interpretation For now object value or fun can be interpreter only if they are marked explicitly. Annotation for all object is restricted and if whole class is marked with CompileTimeAnnotation this doesn't mean that companion object is computable. --- .../backend/common/interpreter/IrInterpreter.kt | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/IrInterpreter.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/IrInterpreter.kt index a4cc052d2d4..244b7f6b81e 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/IrInterpreter.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/IrInterpreter.kt @@ -451,7 +451,16 @@ class IrInterpreter(irModule: IrModuleFragment) { } private fun interpretGetObjectValue(expression: IrGetObjectValue, data: Frame): Code { - data.pushReturnValue(Complex(expression.symbol.owner, mutableListOf())) + val objectState = Complex(expression.symbol.owner, mutableListOf()) + val newFrame = data.copy().apply { addVar(Variable(expression.symbol.descriptor.thisAsReceiverParameter, objectState)) } + + val constructor = expression.symbol.owner.declarations.single { it is IrConstructor } as IrConstructor + val constructorBody = constructor.body?.statements?.get(1) as? IrBlock + val irAnnotatedSetFields = constructorBody?.statements?.filterIsInstance() + ?.filter { it.symbol.owner.correspondingPropertySymbol!!.owner.hasAnnotation(compileTimeAnnotation) } + irAnnotatedSetFields?.forEach { irSetField -> irSetField.interpret(newFrame).also { if (it != Code.NEXT) return it } } + + data.pushReturnValue(objectState) return Code.NEXT }