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);
|
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();
|
DeclarationDescriptor declaration = p.getContainingDeclaration();
|
||||||
if(CodegenUtil.isInterface(declaration)) {
|
if(CodegenUtil.isInterface(declaration)) {
|
||||||
return ACC_PUBLIC;
|
return ACC_PUBLIC;
|
||||||
|
|||||||
@@ -140,7 +140,7 @@ public class PropertyCodegen {
|
|||||||
|
|
||||||
private void generateDefaultGetter(JetProperty p) {
|
private void generateDefaultGetter(JetProperty p) {
|
||||||
final PropertyDescriptor propertyDescriptor = (PropertyDescriptor) state.getBindingContext().get(BindingContext.VARIABLE, 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);
|
generateDefaultGetter(propertyDescriptor, flags, p);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -170,29 +170,31 @@ public class PropertyCodegen {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (v.generateCode() != ClassBuilder.Mode.SIGNATURES && (!isTrait || kind instanceof OwnerKind.DelegateKind)) {
|
if (v.generateCode() != ClassBuilder.Mode.SIGNATURES && (!isTrait || kind instanceof OwnerKind.DelegateKind)) {
|
||||||
mv.visitCode();
|
if(propertyDescriptor.getModality() != Modality.ABSTRACT) {
|
||||||
if (v.generateCode() == ClassBuilder.Mode.STUBS) {
|
mv.visitCode();
|
||||||
StubCodegen.generateStubThrow(mv);
|
if (v.generateCode() == ClassBuilder.Mode.STUBS) {
|
||||||
} else {
|
StubCodegen.generateStubThrow(mv);
|
||||||
InstructionAdapter iv = new InstructionAdapter(mv);
|
} else {
|
||||||
if (kind != OwnerKind.NAMESPACE) {
|
InstructionAdapter iv = new InstructionAdapter(mv);
|
||||||
iv.load(0, JetTypeMapper.TYPE_OBJECT);
|
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) {
|
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)) {
|
if (v.generateCode() != ClassBuilder.Mode.SIGNATURES && (!isTrait || kind instanceof OwnerKind.DelegateKind)) {
|
||||||
mv.visitCode();
|
if(propertyDescriptor.getModality() != Modality.ABSTRACT) {
|
||||||
if (v.generateCode() == ClassBuilder.Mode.STUBS) {
|
mv.visitCode();
|
||||||
StubCodegen.generateStubThrow(mv);
|
if (v.generateCode() == ClassBuilder.Mode.STUBS) {
|
||||||
} else {
|
StubCodegen.generateStubThrow(mv);
|
||||||
InstructionAdapter iv = new InstructionAdapter(mv);
|
} else {
|
||||||
final Type type = state.getTypeMapper().mapType(propertyDescriptor.getType());
|
InstructionAdapter iv = new InstructionAdapter(mv);
|
||||||
int paramCode = 0;
|
final Type type = state.getTypeMapper().mapType(propertyDescriptor.getType());
|
||||||
if (kind != OwnerKind.NAMESPACE) {
|
int paramCode = 0;
|
||||||
iv.load(0, JetTypeMapper.TYPE_OBJECT);
|
if (kind != OwnerKind.NAMESPACE) {
|
||||||
paramCode = 1;
|
iv.load(0, JetTypeMapper.TYPE_OBJECT);
|
||||||
}
|
paramCode = 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (kind instanceof OwnerKind.DelegateKind) {
|
if (kind instanceof OwnerKind.DelegateKind) {
|
||||||
OwnerKind.DelegateKind dk = (OwnerKind.DelegateKind) kind;
|
OwnerKind.DelegateKind dk = (OwnerKind.DelegateKind) kind;
|
||||||
iv.load(0, JetTypeMapper.TYPE_OBJECT);
|
iv.load(0, JetTypeMapper.TYPE_OBJECT);
|
||||||
dk.getDelegate().put(JetTypeMapper.TYPE_OBJECT, iv);
|
dk.getDelegate().put(JetTypeMapper.TYPE_OBJECT, iv);
|
||||||
|
|
||||||
iv.load(paramCode, type);
|
iv.load(paramCode, type);
|
||||||
iv.invokeinterface(dk.getOwnerClass(), setterName(propertyDescriptor.getName()), descriptor);
|
iv.invokeinterface(dk.getOwnerClass(), setterName(propertyDescriptor.getName()), descriptor);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
iv.load(paramCode, type);
|
iv.load(paramCode, type);
|
||||||
iv.visitFieldInsn(kind == OwnerKind.NAMESPACE ? Opcodes.PUTSTATIC : Opcodes.PUTFIELD,
|
iv.visitFieldInsn(kind == OwnerKind.NAMESPACE ? Opcodes.PUTSTATIC : Opcodes.PUTFIELD,
|
||||||
state.getTypeMapper().getOwner(propertyDescriptor, kind), propertyDescriptor.getName(),
|
state.getTypeMapper().getOwner(propertyDescriptor, kind), propertyDescriptor.getName(),
|
||||||
type.getDescriptor());
|
type.getDescriptor());
|
||||||
}
|
}
|
||||||
|
|
||||||
iv.visitInsn(Opcodes.RETURN);
|
iv.visitInsn(Opcodes.RETURN);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
FunctionCodegen.endVisit(mv, "setter", origin);
|
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 {
|
public void testKt1398() throws Exception {
|
||||||
blackBoxFile("regressions/kt1398.kt");
|
blackBoxFile("regressions/kt1398.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testKt1482() throws Exception {
|
||||||
|
createEnvironmentWithFullJdk();
|
||||||
|
blackBoxFile("regressions/kt1482.kt");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user