KT-1482 fix: abstarct properties codegen

This commit is contained in:
Alex Tkachman
2012-03-01 07:24:18 +02:00
parent cac3311f1a
commit 190e539365
4 changed files with 77 additions and 48 deletions
@@ -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;
@@ -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();
}
}
@@ -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"
}
@@ -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");
}
}