Fix generation of property accessor to the underlying value
This commit is contained in:
@@ -239,20 +239,12 @@ public class FunctionCodegen {
|
|||||||
!(containingDeclaration instanceof PackageFragmentDescriptor) &&
|
!(containingDeclaration instanceof PackageFragmentDescriptor) &&
|
||||||
origin.getOriginKind() != JvmDeclarationOriginKind.CLASS_MEMBER_DELEGATION_TO_DEFAULT_IMPL;
|
origin.getOriginKind() != JvmDeclarationOriginKind.CLASS_MEMBER_DELEGATION_TO_DEFAULT_IMPL;
|
||||||
|
|
||||||
boolean isMethodInInlineClassWrapper =
|
|
||||||
isClass(containingDeclaration) &&
|
|
||||||
((ClassDescriptor) containingDeclaration).isInline() &&
|
|
||||||
contextKind != OwnerKind.ERASED_INLINE_CLASS &&
|
|
||||||
!(functionDescriptor instanceof ConstructorDescriptor) &&
|
|
||||||
!KotlinTypeMapper.isAccessor(functionDescriptor) &&
|
|
||||||
origin.getOriginKind() != JvmDeclarationOriginKind.UNBOX_METHOD_OF_INLINE_CLASS;
|
|
||||||
|
|
||||||
if (isOpenSuspendInClass) {
|
if (isOpenSuspendInClass) {
|
||||||
generateOpenMethodInSuspendClass(
|
generateOpenMethodInSuspendClass(
|
||||||
origin, functionDescriptor, methodContext, strategy, mv, jvmSignature, asmMethod, flags, staticInCompanionObject
|
origin, functionDescriptor, methodContext, strategy, mv, jvmSignature, asmMethod, flags, staticInCompanionObject
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
else if (isMethodInInlineClassWrapper) {
|
else if (shouldDelegateMethodBodyToInlineClass(origin, functionDescriptor, contextKind, containingDeclaration, bindingContext)) {
|
||||||
generateMethodInsideInlineClassWrapper(origin, functionDescriptor, (ClassDescriptor) containingDeclaration, mv);
|
generateMethodInsideInlineClassWrapper(origin, functionDescriptor, (ClassDescriptor) containingDeclaration, mv);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -262,6 +254,34 @@ public class FunctionCodegen {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static boolean shouldDelegateMethodBodyToInlineClass(
|
||||||
|
@NotNull JvmDeclarationOrigin origin,
|
||||||
|
@NotNull FunctionDescriptor functionDescriptor,
|
||||||
|
@NotNull OwnerKind contextKind,
|
||||||
|
@NotNull DeclarationDescriptor containingDeclaration,
|
||||||
|
@NotNull BindingContext bindingContext
|
||||||
|
) {
|
||||||
|
// special kind / function
|
||||||
|
if (contextKind == OwnerKind.ERASED_INLINE_CLASS) return false;
|
||||||
|
if (origin.getOriginKind() == JvmDeclarationOriginKind.UNBOX_METHOD_OF_INLINE_CLASS) return false;
|
||||||
|
|
||||||
|
// descriptor corresponds to the underlying value
|
||||||
|
if (functionDescriptor instanceof PropertyAccessorDescriptor) {
|
||||||
|
PropertyDescriptor property = ((PropertyAccessorDescriptor) functionDescriptor).getCorrespondingProperty();
|
||||||
|
// property for the underlying value
|
||||||
|
if (JvmCodegenUtil.hasBackingField(property, contextKind, bindingContext)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// base check
|
||||||
|
boolean isInlineClass = isClass(containingDeclaration) && ((ClassDescriptor) containingDeclaration).isInline();
|
||||||
|
boolean simpleFunctionOrProperty =
|
||||||
|
!(functionDescriptor instanceof ConstructorDescriptor) && !KotlinTypeMapper.isAccessor(functionDescriptor);
|
||||||
|
|
||||||
|
return isInlineClass && simpleFunctionOrProperty;
|
||||||
|
}
|
||||||
|
|
||||||
private void generateMethodInsideInlineClassWrapper(
|
private void generateMethodInsideInlineClassWrapper(
|
||||||
@NotNull JvmDeclarationOrigin origin,
|
@NotNull JvmDeclarationOrigin origin,
|
||||||
@NotNull FunctionDescriptor functionDescriptor,
|
@NotNull FunctionDescriptor functionDescriptor,
|
||||||
|
|||||||
Vendored
+8
@@ -0,0 +1,8 @@
|
|||||||
|
// !LANGUAGE: +InlineClasses
|
||||||
|
|
||||||
|
inline class UInt(val value: Int)
|
||||||
|
|
||||||
|
// 0 INVOKESTATIC UInt\$Erased.getValue
|
||||||
|
|
||||||
|
// 0 valueOf
|
||||||
|
// 0 intValue
|
||||||
@@ -1944,6 +1944,12 @@ public class BytecodeTextTestGenerated extends AbstractBytecodeTextTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("generationOfAccessorToUnderlyingValue.kt")
|
||||||
|
public void testGenerationOfAccessorToUnderlyingValue() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/inlineClasses/generationOfAccessorToUnderlyingValue.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("inlineClassBoxingOnAssignment.kt")
|
@TestMetadata("inlineClassBoxingOnAssignment.kt")
|
||||||
public void testInlineClassBoxingOnAssignment() throws Exception {
|
public void testInlineClassBoxingOnAssignment() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/inlineClasses/inlineClassBoxingOnAssignment.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/inlineClasses/inlineClassBoxingOnAssignment.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user