From a07954eaac843a544a3055e163c702e2285346fb Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 9 Jul 2012 22:11:02 +0400 Subject: [PATCH] load 'this' instead of $classobj if we're inside class object's constructor #KT-2384 Fixed --- .../jetbrains/jet/codegen/ExpressionCodegen.java | 8 ++++++-- compiler/testData/codegen/regressions/kt2384.kt | 15 +++++++++++++++ .../org/jetbrains/jet/codegen/ClassGenTest.java | 5 +++++ 3 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/codegen/regressions/kt2384.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index f517b4eb9c6..26987e2dcf2 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -1487,11 +1487,15 @@ public class ExpressionCodegen extends JetVisitor { if (descriptor instanceof ClassReceiver) { Type exprType = asmType(descriptor.getType()); ClassReceiver classReceiver = (ClassReceiver) descriptor; - ClassDescriptor classReceiverDeclarationDescriptor = (ClassDescriptor) classReceiver.getDeclarationDescriptor(); + ClassDescriptor classReceiverDeclarationDescriptor = classReceiver.getDeclarationDescriptor(); if (DescriptorUtils.isClassObject(classReceiverDeclarationDescriptor)) { ClassDescriptor containingDeclaration = (ClassDescriptor) classReceiverDeclarationDescriptor.getContainingDeclaration(); Type classObjType = typeMapper.mapType(containingDeclaration.getDefaultType(), MapTypeMode.IMPL); - v.getstatic(classObjType.getInternalName(), "$classobj", exprType.getDescriptor()); + if (context.getContextDescriptor() instanceof ConstructorDescriptor && classReceiverDeclarationDescriptor.getDefaultType().equals(((ConstructorDescriptor)context.getContextDescriptor()).getReturnType())) { + v.load(0, classObjType); + } else { + v.getstatic(classObjType.getInternalName(), "$classobj", exprType.getDescriptor()); + } } else { generateThisOrOuter(classReceiverDeclarationDescriptor).put(exprType, v); diff --git a/compiler/testData/codegen/regressions/kt2384.kt b/compiler/testData/codegen/regressions/kt2384.kt new file mode 100644 index 00000000000..20900c9069f --- /dev/null +++ b/compiler/testData/codegen/regressions/kt2384.kt @@ -0,0 +1,15 @@ +class A { + class object { + val b = 0 + val c = b + + { + val d = b + } + } +} + +fun box(): String { + A() + return if (A.c == A.b) "OK" else "Fail" +} diff --git a/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java index 9321eaaa26b..50e2b3ce13e 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java @@ -451,4 +451,9 @@ public class ClassGenTest extends CodegenTestCase { createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY); blackBoxFile("regressions/kt2224.kt"); } + + public void testKt2384() { + createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY); + blackBoxFile("regressions/kt2384.kt"); + } }