Fix VerifyError on primitive override properties
Don't just blindly map property type in PropertyCodegen when generating getter: we already have its full signature, so we can just as well take the type from it. The former also isn't correct for properties which are overrides with a primitive type. Simple mapType is safe for setter though, because the type of a method parameter cannot change with override on JVM The change in StackValue relates to call sites of properties which return Unit: in that case StackValue's this.type is V, whereas the return type of its getter is Ljet/Unit; -- so coerceTo was coercing from the wrong type in case of getter calls #KT-4373 Fixed #KT-4383 Fixed
This commit is contained in:
@@ -316,7 +316,6 @@ public class PropertyCodegen extends GenerationStateAware {
|
||||
public void doGenerateBody(@NotNull ExpressionCodegen codegen, @NotNull JvmMethodSignature signature) {
|
||||
InstructionAdapter v = codegen.v;
|
||||
PropertyDescriptor propertyDescriptor = callableDescriptor.getCorrespondingProperty();
|
||||
Type type = codegen.typeMapper.mapType(propertyDescriptor);
|
||||
|
||||
int paramCode = 0;
|
||||
if (codegen.context.getContextKind() != OwnerKind.NAMESPACE) {
|
||||
@@ -327,6 +326,7 @@ public class PropertyCodegen extends GenerationStateAware {
|
||||
StackValue property = codegen.intermediateValueForProperty(propertyDescriptor, true, null);
|
||||
|
||||
if (callableDescriptor instanceof PropertyGetterDescriptor) {
|
||||
Type type = signature.getReturnType();
|
||||
property.put(type, v);
|
||||
v.areturn(type);
|
||||
}
|
||||
@@ -335,8 +335,8 @@ public class PropertyCodegen extends GenerationStateAware {
|
||||
if (receiverParameter != null) {
|
||||
paramCode += codegen.typeMapper.mapType(receiverParameter.getType()).getSize();
|
||||
}
|
||||
Type type = codegen.typeMapper.mapType(propertyDescriptor);
|
||||
v.load(paramCode, type);
|
||||
|
||||
property.store(type, v);
|
||||
v.visitInsn(RETURN);
|
||||
} else {
|
||||
@@ -370,14 +370,9 @@ public class PropertyCodegen extends GenerationStateAware {
|
||||
StackValue delegatedProperty = codegen.intermediateValueForProperty(propertyDescriptor, true, null);
|
||||
StackValue lastValue = codegen.invokeFunction(call, delegatedProperty, resolvedCall);
|
||||
|
||||
if (lastValue.type != Type.VOID_TYPE) {
|
||||
Type asmType = codegen.typeMapper.mapType(propertyDescriptor);
|
||||
lastValue.put(asmType, v);
|
||||
v.areturn(asmType);
|
||||
}
|
||||
else {
|
||||
v.areturn(Type.VOID_TYPE);
|
||||
}
|
||||
Type asmType = signature.getReturnType();
|
||||
lastValue.put(asmType, v);
|
||||
v.areturn(asmType);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -865,12 +865,13 @@ public abstract class StackValue {
|
||||
v.visitFieldInsn(isStatic ? GETSTATIC : GETFIELD, methodOwner.getInternalName(), getPropertyName(),
|
||||
this.type.getDescriptor());
|
||||
genNotNullAssertionForField(v, state, descriptor);
|
||||
coerceTo(type, v);
|
||||
}
|
||||
else {
|
||||
Method method = getter.getAsmMethod();
|
||||
v.visitMethodInsn(getter.getInvokeOpcode(), getter.getOwner().getInternalName(), method.getName(), method.getDescriptor());
|
||||
coerce(method.getReturnType(), type, v);
|
||||
}
|
||||
coerceTo(type, v);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user