From 7fe71d21f3a1e0a13efa067488207bfb583a182a Mon Sep 17 00:00:00 2001 From: Michael Bogdanov Date: Thu, 8 Oct 2015 13:52:51 +0300 Subject: [PATCH] Initialize class companion object fields on accessing its java class --- .../codegen/ImplementationBodyCodegen.java | 6 ++++++ .../codegen/box/objects/initializationOrder.kt | 16 ++++++++++++++++ .../generated/BlackBoxCodegenTestGenerated.java | 6 ++++++ 3 files changed, 28 insertions(+) create mode 100644 compiler/testData/codegen/box/objects/initializationOrder.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java index 2ad0d381810..a42d01826fa 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java @@ -1001,6 +1001,12 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { InstructionAdapter v = createOrGetClInitCodegen().v; v.anew(classAsmType); v.invokespecial(classAsmType.getInternalName(), "", "()V", false); + if (isCompanionObjectWithBackingFieldsInOuter(descriptor)) { + //We should load containing class to initialize companion fields + StackValue companion = StackValue.singletonForCompanion(descriptor, typeMapper); + companion.put(companion.type, v); + AsmUtil.pop(v, companion.type); + } return; } diff --git a/compiler/testData/codegen/box/objects/initializationOrder.kt b/compiler/testData/codegen/box/objects/initializationOrder.kt new file mode 100644 index 00000000000..2281132636b --- /dev/null +++ b/compiler/testData/codegen/box/objects/initializationOrder.kt @@ -0,0 +1,16 @@ +var result = "OK" + +class A { + companion object { + var z = result + + fun patchResult() { + result = "fail" + } + } +} + +fun box(): String { + A.patchResult() + return A.z +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java index 21c44339400..930065871f6 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java @@ -5560,6 +5560,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("initializationOrder.kt") + public void testInitializationOrder() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/initializationOrder.kt"); + doTest(fileName); + } + @TestMetadata("kt1047.kt") public void testKt1047() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/kt1047.kt");