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");