KT-1482 fix: abstarct properties codegen
This commit is contained in:
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user