From c90a6263a1ca256e97fd855de200ddd6064db833 Mon Sep 17 00:00:00 2001 From: Alex Tkachman Date: Thu, 15 Dec 2011 17:21:56 +0200 Subject: [PATCH] class object field access --- .../org/jetbrains/jet/codegen/ExpressionCodegen.java | 10 +++++++++- .../tests/org/jetbrains/jet/codegen/ClassGenTest.java | 6 ++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 4513595264f..39101c75e48 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -1254,7 +1254,15 @@ public class ExpressionCodegen extends JetVisitor { if(descriptor instanceof ClassReceiver) { Type exprType = asmType(descriptor.getType()); ClassReceiver classReceiver = (ClassReceiver) descriptor; - generateThisOrOuter((ClassDescriptor) classReceiver.getDeclarationDescriptor()).put(exprType, v); + ClassDescriptor classReceiverDeclarationDescriptor = (ClassDescriptor) classReceiver.getDeclarationDescriptor(); + if(CodegenUtil.isClassObject(classReceiverDeclarationDescriptor)) { + ClassDescriptor containingDeclaration = (ClassDescriptor) classReceiverDeclarationDescriptor.getContainingDeclaration(); + Type classObjType = typeMapper.mapType(containingDeclaration.getDefaultType()); + v.getstatic(classObjType.getInternalName(), "$classobj", exprType.getDescriptor()); + } + else { + generateThisOrOuter(classReceiverDeclarationDescriptor).put(exprType, v); + } if(type != null) StackValue.onStack(exprType).put(type, v); } diff --git a/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java index 88e445a6bb1..9312dadc793 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java @@ -166,6 +166,12 @@ public class ClassGenTest extends CodegenTestCase { assertEquals(0xFF0000, rgbMethod.invoke(redValue)); } + public void testClassObjFields() throws Exception { + loadText("class A() { class object { val value = 10 } }\n" + + "fun box() = if(A.value == 10) \"OK\" else \"fail\""); + blackBox(); + } + public void testKt249() throws Exception { blackBoxFile("regressions/kt249.jet"); }