From 89d6f25fb63b73dfcbf2cd37ba0004b4a0155190 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 9 Jun 2014 17:52:10 +0400 Subject: [PATCH] Fix initialization order of KClass field and class object fields --- .../jet/codegen/ImplementationBodyCodegen.java | 8 ++++---- .../property/kClassInstanceIsInitializedFirst.kt | 11 +++++++++++ .../BlackBoxWithStdlibCodegenTestGenerated.java | 5 +++++ 3 files changed, 20 insertions(+), 4 deletions(-) create mode 100644 compiler/testData/codegen/boxWithStdlib/callableReference/property/kClassInstanceIsInitializedFirst.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 70456a08250..9425d6e31f1 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -208,6 +208,8 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { writeInnerClasses(); AnnotationCodegen.forClass(v.getVisitor(), typeMapper).genAnnotations(descriptor, null); + + generateReflectionObjectFieldIfNeeded(); } @Override @@ -428,7 +430,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { @Override protected void generateSyntheticParts() { - generateStaticSyntheticFields(); + generatePropertyMetadataArrayFieldIfNeeded(classAsmType); generateFieldForSingleton(); @@ -465,7 +467,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { genClosureFields(context.closure, v, typeMapper); } - private void generateStaticSyntheticFields() { + private void generateReflectionObjectFieldIfNeeded() { if (isAnnotationClass(descriptor)) { // There's a bug in JDK 6 and 7 that prevents us from generating a static field in an annotation class: // http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6857918 @@ -475,8 +477,6 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { generateReflectionObjectField(state, classAsmType, v, method("kClass", K_CLASS_IMPL_TYPE, getType(Class.class)), JvmAbi.KOTLIN_CLASS_FIELD_NAME, createOrGetClInitCodegen().v); - - generatePropertyMetadataArrayFieldIfNeeded(classAsmType); } private boolean isGenericToArrayPresent() { diff --git a/compiler/testData/codegen/boxWithStdlib/callableReference/property/kClassInstanceIsInitializedFirst.kt b/compiler/testData/codegen/boxWithStdlib/callableReference/property/kClassInstanceIsInitializedFirst.kt new file mode 100644 index 00000000000..cc80b293bf7 --- /dev/null +++ b/compiler/testData/codegen/boxWithStdlib/callableReference/property/kClassInstanceIsInitializedFirst.kt @@ -0,0 +1,11 @@ +class A { + class object { + val ref: KMemberProperty = A::foo + } + + val foo: String = "OK" +} + +fun box(): String { + return A.ref.get(A()) +} diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java index cbdf3206a6a..dc620d36cdf 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java @@ -444,6 +444,11 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode doTestWithStdlib("compiler/testData/codegen/boxWithStdlib/callableReference/property/javaBeanConvention.kt"); } + @TestMetadata("kClassInstanceIsInitializedFirst.kt") + public void testKClassInstanceIsInitializedFirst() throws Exception { + doTestWithStdlib("compiler/testData/codegen/boxWithStdlib/callableReference/property/kClassInstanceIsInitializedFirst.kt"); + } + @TestMetadata("localClassVar.kt") public void testLocalClassVar() throws Exception { doTestWithStdlib("compiler/testData/codegen/boxWithStdlib/callableReference/property/localClassVar.kt");