From f8983d851668bf7fbcf601aa932887535829a9cf Mon Sep 17 00:00:00 2001 From: Alex Tkachman Date: Sat, 15 Sep 2012 21:23:42 +0300 Subject: [PATCH] static final field for class object moved to class object class from containing class --- .../jet/codegen/ExpressionCodegen.java | 17 +++------- .../codegen/ImplementationBodyCodegen.java | 33 +++++++------------ .../plugin/javaFacade/JetJavaFacadeTest.java | 19 +++++++---- 3 files changed, 29 insertions(+), 40 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index dfe48c29a64..e1c766d1df0 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -59,12 +59,12 @@ import org.jetbrains.jet.lexer.JetTokens; import java.util.*; import static org.jetbrains.asm4.Opcodes.*; -import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.*; import static org.jetbrains.jet.codegen.CodegenUtil.*; import static org.jetbrains.jet.codegen.binding.CodegenBinding.*; import static org.jetbrains.jet.lang.resolve.BindingContext.*; import static org.jetbrains.jet.lang.resolve.BindingContextUtils.descriptorToDeclaration; import static org.jetbrains.jet.lang.resolve.BindingContextUtils.getNotNull; +import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.*; /** * @author max @@ -1397,14 +1397,9 @@ public class ExpressionCodegen extends JetVisitor implem if (descriptor instanceof ClassDescriptor) { PsiElement declaration = descriptorToDeclaration(bindingContext, descriptor); if (declaration instanceof JetClass) { - final ClassDescriptor descriptor1 = ((ClassDescriptor) descriptor).getClassObjectDescriptor(); - assert descriptor1 != null; - final Type type = typeMapper.mapType(descriptor1); - return StackValue.field(type, - JvmClassName.byType(typeMapper.mapType(((ClassDescriptor) descriptor).getDefaultType(), - JetTypeMapperMode.IMPL)), - "$classobj", - true); + final ClassDescriptor classObjectDescriptor = ((ClassDescriptor) descriptor).getClassObjectDescriptor(); + assert classObjectDescriptor != null; + return StackValue.singleton(classObjectDescriptor, typeMapper); } else { // todo ? @@ -1875,9 +1870,7 @@ public class ExpressionCodegen extends JetVisitor implem v.load(0, OBJECT_TYPE); } else { - ClassDescriptor containingDeclaration = (ClassDescriptor) classReceiverDeclarationDescriptor.getContainingDeclaration(); - Type classObjType = typeMapper.mapType(containingDeclaration.getDefaultType(), JetTypeMapperMode.IMPL); - v.getstatic(classObjType.getInternalName(), "$classobj", exprType.getDescriptor()); + v.getstatic(exprType.getInternalName(), "$instance", exprType.getDescriptor()); } StackValue.onStack(exprType).put(type, v); } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index d8b55098670..b452542d049 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -591,28 +591,19 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { } private void generateFieldForClassObject() { - final JetClassObject classObject = getClassObject(); - if (classObject != null) { - final ClassDescriptor descriptor1 = bindingContext.get(BindingContext.CLASS, classObject.getObjectDeclaration()); - assert descriptor1 != null; - Type type = Type.getObjectType(typeMapper.mapType(descriptor1).getInternalName()); - v.newField(classObject, ACC_PUBLIC | ACC_STATIC | ACC_FINAL, "$classobj", type.getDescriptor(), null, null); + if (descriptor.getKind() != ClassKind.CLASS_OBJECT) return; - staticInitializerChunks.add(new CodeChunk() { - @Override - public void generate(InstructionAdapter v) { - final ClassDescriptor descriptor1 = bindingContext.get(BindingContext.CLASS, classObject.getObjectDeclaration()); - assert descriptor1 != null; - String name = typeMapper.mapType(descriptor1.getDefaultType(), JetTypeMapperMode.IMPL).getInternalName(); - final Type classObjectType = Type.getObjectType(name); - v.anew(classObjectType); - v.dup(); - v.invokespecial(name, "", "()V"); - v.putstatic(typeMapper.mapType(descriptor).getInternalName(), "$classobj", - classObjectType.getDescriptor()); - } - }); - } + v.newField(myClass, ACC_PUBLIC | ACC_STATIC | ACC_FINAL , "$instance", classAsmType.getDescriptor(), null, null); + + staticInitializerChunks.add(new CodeChunk() { + @Override + public void generate(InstructionAdapter v) { + v.anew(classAsmType); + v.dup(); + v.invokespecial(classAsmType.getInternalName(), "", "()V"); + v.putstatic(typeMapper.mapType(descriptor).getInternalName(), "$instance", classAsmType.getDescriptor()); + } + }); } protected void generatePrimaryConstructor() { diff --git a/idea/tests/org/jetbrains/jet/plugin/javaFacade/JetJavaFacadeTest.java b/idea/tests/org/jetbrains/jet/plugin/javaFacade/JetJavaFacadeTest.java index 24bb5eb4bc9..a3df896e162 100644 --- a/idea/tests/org/jetbrains/jet/plugin/javaFacade/JetJavaFacadeTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/javaFacade/JetJavaFacadeTest.java @@ -106,16 +106,21 @@ public class JetJavaFacadeTest extends LightCodeInsightFixtureTestCase { assertNotNull(theClass); - PsiField classobj = theClass.findFieldByName("$classobj", false); - assertTrue(classobj != null && classobj.hasModifierProperty(PsiModifier.STATIC)); + PsiField classobjField = theClass.findFieldByName("$classobj", false); + assertNull(classobjField); - PsiType type = classobj.getType(); - assertTrue(type instanceof PsiClassType); + final PsiClass classObjectClass = theClass.findInnerClassByName("ClassObject$", false); + assertNotNull(classObjectClass); + assertEquals("foo.TheClass.ClassObject$", classObjectClass.getQualifiedName()); + assertTrue(classObjectClass.hasModifierProperty(PsiModifier.STATIC)); - assertEquals("foo.TheClass.ClassObject$", type.getCanonicalText()); + final PsiField instance = classObjectClass.findFieldByName("$instance", false); + assertNotNull(instance); + assertEquals("foo.TheClass.ClassObject$", instance.getType().getCanonicalText()); + assertTrue(instance.hasModifierProperty(PsiModifier.PUBLIC)); + assertTrue(instance.hasModifierProperty(PsiModifier.STATIC)); + assertTrue(instance.hasModifierProperty(PsiModifier.FINAL)); - PsiClass classObjectClass = ((PsiClassType) type).resolve(); - assertTrue(classObjectClass != null && classObjectClass.hasModifierProperty(PsiModifier.STATIC)); PsiMethod[] methods = classObjectClass.findMethodsByName("getOut", false); assertEquals("java.io.PrintStream", methods[0].getReturnType().getCanonicalText());