From 190e539365404b700516724a84ee022b11cfaf5d Mon Sep 17 00:00:00 2001 From: Alex Tkachman Date: Thu, 1 Mar 2012 07:24:18 +0200 Subject: [PATCH] KT-1482 fix: abstarct properties codegen --- .../jetbrains/jet/codegen/JetTypeMapper.java | 2 +- .../jet/codegen/PropertyCodegen.java | 97 ++++++++++--------- .../testData/codegen/regressions/kt1482.kt | 21 ++++ .../jet/codegen/PropertyGenTest.java | 5 + 4 files changed, 77 insertions(+), 48 deletions(-) create mode 100644 compiler/testData/codegen/regressions/kt1482.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java index b2e0c0a01f2..cf2e67fc132 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java @@ -710,7 +710,7 @@ public class JetTypeMapper { return new CallableMethod(owner, owner, owner, method, INVOKESPECIAL); } - public static int getAccessModifiers(DeclarationDescriptorWithVisibility p, int defaultFlags) { + public static int getAccessModifiers(MemberDescriptor p, int defaultFlags) { DeclarationDescriptor declaration = p.getContainingDeclaration(); if(CodegenUtil.isInterface(declaration)) { return ACC_PUBLIC; diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java index 375fbca4fd3..4287c2466e4 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java @@ -140,7 +140,7 @@ public class PropertyCodegen { private void generateDefaultGetter(JetProperty p) { final PropertyDescriptor propertyDescriptor = (PropertyDescriptor) state.getBindingContext().get(BindingContext.VARIABLE, p); - int flags = JetTypeMapper.getAccessModifiers(propertyDescriptor, 0); + int flags = JetTypeMapper.getAccessModifiers(propertyDescriptor, 0) | (propertyDescriptor.getModality() == Modality.ABSTRACT ? Opcodes.ACC_ABSTRACT : 0); generateDefaultGetter(propertyDescriptor, flags, p); } @@ -170,29 +170,31 @@ public class PropertyCodegen { } if (v.generateCode() != ClassBuilder.Mode.SIGNATURES && (!isTrait || kind instanceof OwnerKind.DelegateKind)) { - mv.visitCode(); - if (v.generateCode() == ClassBuilder.Mode.STUBS) { - StubCodegen.generateStubThrow(mv); - } else { - InstructionAdapter iv = new InstructionAdapter(mv); - if (kind != OwnerKind.NAMESPACE) { - iv.load(0, JetTypeMapper.TYPE_OBJECT); + if(propertyDescriptor.getModality() != Modality.ABSTRACT) { + mv.visitCode(); + if (v.generateCode() == ClassBuilder.Mode.STUBS) { + StubCodegen.generateStubThrow(mv); + } else { + InstructionAdapter iv = new InstructionAdapter(mv); + if (kind != OwnerKind.NAMESPACE) { + iv.load(0, JetTypeMapper.TYPE_OBJECT); + } + final Type type = state.getTypeMapper().mapType(propertyDescriptor.getType()); + if (kind instanceof OwnerKind.DelegateKind) { + OwnerKind.DelegateKind dk = (OwnerKind.DelegateKind) kind; + dk.getDelegate().put(JetTypeMapper.TYPE_OBJECT, iv); + iv.invokeinterface(dk.getOwnerClass(), getterName, descriptor); + } + else { + iv.visitFieldInsn(kind == OwnerKind.NAMESPACE ? Opcodes.GETSTATIC : Opcodes.GETFIELD, + state.getTypeMapper().getOwner(propertyDescriptor, kind), propertyDescriptor.getName(), + type.getDescriptor()); + } + iv.areturn(type); } - final Type type = state.getTypeMapper().mapType(propertyDescriptor.getType()); - if (kind instanceof OwnerKind.DelegateKind) { - OwnerKind.DelegateKind dk = (OwnerKind.DelegateKind) kind; - dk.getDelegate().put(JetTypeMapper.TYPE_OBJECT, iv); - iv.invokeinterface(dk.getOwnerClass(), getterName, descriptor); - } - else { - iv.visitFieldInsn(kind == OwnerKind.NAMESPACE ? Opcodes.GETSTATIC : Opcodes.GETFIELD, - state.getTypeMapper().getOwner(propertyDescriptor, kind), propertyDescriptor.getName(), - type.getDescriptor()); - } - iv.areturn(type); } - FunctionCodegen.endVisit(mv, "getter", origin); } + FunctionCodegen.endVisit(mv, "getter", origin); } public static void generateJetPropertyAnnotation(MethodVisitor mv, @NotNull String kotlinType, @NotNull String typeParameters) { @@ -238,37 +240,38 @@ public class PropertyCodegen { } if (v.generateCode() != ClassBuilder.Mode.SIGNATURES && (!isTrait || kind instanceof OwnerKind.DelegateKind)) { - mv.visitCode(); - if (v.generateCode() == ClassBuilder.Mode.STUBS) { - StubCodegen.generateStubThrow(mv); - } else { - InstructionAdapter iv = new InstructionAdapter(mv); - final Type type = state.getTypeMapper().mapType(propertyDescriptor.getType()); - int paramCode = 0; - if (kind != OwnerKind.NAMESPACE) { - iv.load(0, JetTypeMapper.TYPE_OBJECT); - paramCode = 1; - } + if(propertyDescriptor.getModality() != Modality.ABSTRACT) { + mv.visitCode(); + if (v.generateCode() == ClassBuilder.Mode.STUBS) { + StubCodegen.generateStubThrow(mv); + } else { + InstructionAdapter iv = new InstructionAdapter(mv); + final Type type = state.getTypeMapper().mapType(propertyDescriptor.getType()); + int paramCode = 0; + if (kind != OwnerKind.NAMESPACE) { + iv.load(0, JetTypeMapper.TYPE_OBJECT); + paramCode = 1; + } - if (kind instanceof OwnerKind.DelegateKind) { - OwnerKind.DelegateKind dk = (OwnerKind.DelegateKind) kind; - iv.load(0, JetTypeMapper.TYPE_OBJECT); - dk.getDelegate().put(JetTypeMapper.TYPE_OBJECT, iv); + if (kind instanceof OwnerKind.DelegateKind) { + OwnerKind.DelegateKind dk = (OwnerKind.DelegateKind) kind; + iv.load(0, JetTypeMapper.TYPE_OBJECT); + dk.getDelegate().put(JetTypeMapper.TYPE_OBJECT, iv); - iv.load(paramCode, type); - iv.invokeinterface(dk.getOwnerClass(), setterName(propertyDescriptor.getName()), descriptor); - } - else { - iv.load(paramCode, type); - iv.visitFieldInsn(kind == OwnerKind.NAMESPACE ? Opcodes.PUTSTATIC : Opcodes.PUTFIELD, - state.getTypeMapper().getOwner(propertyDescriptor, kind), propertyDescriptor.getName(), - type.getDescriptor()); - } + iv.load(paramCode, type); + iv.invokeinterface(dk.getOwnerClass(), setterName(propertyDescriptor.getName()), descriptor); + } + else { + iv.load(paramCode, type); + iv.visitFieldInsn(kind == OwnerKind.NAMESPACE ? Opcodes.PUTSTATIC : Opcodes.PUTFIELD, + state.getTypeMapper().getOwner(propertyDescriptor, kind), propertyDescriptor.getName(), + type.getDescriptor()); + } - iv.visitInsn(Opcodes.RETURN); + iv.visitInsn(Opcodes.RETURN); + } } FunctionCodegen.endVisit(mv, "setter", origin); - mv.visitEnd(); } } diff --git a/compiler/testData/codegen/regressions/kt1482.kt b/compiler/testData/codegen/regressions/kt1482.kt new file mode 100644 index 00000000000..f651196a18b --- /dev/null +++ b/compiler/testData/codegen/regressions/kt1482.kt @@ -0,0 +1,21 @@ +abstract class ClassValAbstract { + abstract val a: Int + + class object { + val methods = (this as java.lang.Object).getClass()?.classLoader?.loadClass("ClassValAbstract")?.getMethods() + } +} + +fun box() : String { + for(m in ClassValAbstract.methods) { + if(m.sure().getName() == "getA") { + if(m.sure().getModifiers() != 1024) + return "get failed" + } + if(m.sure().getName() == "setA") { + if(m.sure().getModifiers() != 1024) + return "set failed" + } + } + return "OK" +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/PropertyGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/PropertyGenTest.java index bb61e4ff654..9491c4932bf 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/PropertyGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/PropertyGenTest.java @@ -214,4 +214,9 @@ public class PropertyGenTest extends CodegenTestCase { public void testKt1398() throws Exception { blackBoxFile("regressions/kt1398.kt"); } + + public void testKt1482() throws Exception { + createEnvironmentWithFullJdk(); + blackBoxFile("regressions/kt1482.kt"); + } }