Fix coercion for stack value property in case of inline classes
#KT-25771 Fixed
This commit is contained in:
@@ -1478,18 +1478,21 @@ public abstract class StackValue {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Type typeOfValueOnStack = getter.getReturnType();
|
Type typeOfValueOnStack = getter.getReturnType();
|
||||||
|
KotlinType kotlinTypeOfValueOnStack = getterDescriptor.getReturnType();
|
||||||
if (DescriptorUtils.isAnnotationClass(descriptor.getContainingDeclaration())) {
|
if (DescriptorUtils.isAnnotationClass(descriptor.getContainingDeclaration())) {
|
||||||
if (this.type.equals(K_CLASS_TYPE)) {
|
if (this.type.equals(K_CLASS_TYPE)) {
|
||||||
wrapJavaClassIntoKClass(v);
|
wrapJavaClassIntoKClass(v);
|
||||||
typeOfValueOnStack = K_CLASS_TYPE;
|
typeOfValueOnStack = K_CLASS_TYPE;
|
||||||
|
kotlinTypeOfValueOnStack = null;
|
||||||
}
|
}
|
||||||
else if (this.type.equals(K_CLASS_ARRAY_TYPE)) {
|
else if (this.type.equals(K_CLASS_ARRAY_TYPE)) {
|
||||||
wrapJavaClassesIntoKClasses(v);
|
wrapJavaClassesIntoKClasses(v);
|
||||||
typeOfValueOnStack = K_CLASS_ARRAY_TYPE;
|
typeOfValueOnStack = K_CLASS_ARRAY_TYPE;
|
||||||
|
kotlinTypeOfValueOnStack = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
coerce(typeOfValueOnStack, type, v);
|
coerce(typeOfValueOnStack, kotlinTypeOfValueOnStack, type, kotlinType, v);
|
||||||
|
|
||||||
KotlinType returnType = descriptor.getReturnType();
|
KotlinType returnType = descriptor.getReturnType();
|
||||||
if (returnType != null && KotlinBuiltIns.isNothing(returnType)) {
|
if (returnType != null && KotlinBuiltIns.isNothing(returnType)) {
|
||||||
@@ -1563,10 +1566,14 @@ public abstract class StackValue {
|
|||||||
v.visitFieldInsn(isStaticStore ? PUTSTATIC : PUTFIELD, backingFieldOwner.getInternalName(), fieldName, this.type.getDescriptor());
|
v.visitFieldInsn(isStaticStore ? PUTSTATIC : PUTFIELD, backingFieldOwner.getInternalName(), fieldName, this.type.getDescriptor());
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
coerce(topOfStackType, ArraysKt.last(setter.getParameterTypes()), v);
|
PropertySetterDescriptor setterDescriptor = descriptor.getSetter();
|
||||||
|
KotlinType setterLastParameterType =
|
||||||
|
setterDescriptor != null ? CollectionsKt.last(setterDescriptor.getValueParameters()).getReturnType() : null;
|
||||||
|
|
||||||
|
coerce(topOfStackType, topOfStackKotlinType, ArraysKt.last(this.setter.getParameterTypes()), setterLastParameterType, v);
|
||||||
setter.genInvokeInstruction(v);
|
setter.genInvokeInstruction(v);
|
||||||
|
|
||||||
Type returnType = setter.getReturnType();
|
Type returnType = this.setter.getReturnType();
|
||||||
if (returnType != Type.VOID_TYPE) {
|
if (returnType != Type.VOID_TYPE) {
|
||||||
pop(v, returnType);
|
pop(v, returnType);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
// !LANGUAGE: +InlineClasses
|
||||||
|
// IGNORE_BACKEND: JVM_IR, JS_IR
|
||||||
|
|
||||||
|
inline class SuccessOrFailure<out T>(val value: Any?) {
|
||||||
|
val isFailure: Boolean get() = value is Failure
|
||||||
|
|
||||||
|
public companion object {
|
||||||
|
public inline fun <T> success(value: T): SuccessOrFailure<T> =
|
||||||
|
SuccessOrFailure(value)
|
||||||
|
|
||||||
|
public inline fun <T> failure(exception: Throwable): SuccessOrFailure<T> =
|
||||||
|
SuccessOrFailure(Failure(exception))
|
||||||
|
}
|
||||||
|
|
||||||
|
class Failure (
|
||||||
|
val exception: Throwable
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun <R> runCatching(block: () -> R): SuccessOrFailure<R> {
|
||||||
|
return try {
|
||||||
|
SuccessOrFailure.success(block())
|
||||||
|
} catch (e: Throwable) {
|
||||||
|
SuccessOrFailure.failure(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Box<T>(val x: T)
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val r = runCatching { TODO() }
|
||||||
|
val b = Box(r)
|
||||||
|
if (r.isFailure != b.x.isFailure || !r.isFailure) return "Fail: r=${r.isFailure}; b.x=${b.x.isFailure}"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
// !LANGUAGE: +InlineClasses
|
||||||
|
// IGNORE_BACKEND: JVM_IR
|
||||||
|
|
||||||
|
inline class Foo(val s: Any) {
|
||||||
|
fun isString(): Boolean = s is String
|
||||||
|
}
|
||||||
|
|
||||||
|
class Box<T>(val x: T)
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val f = Foo("string")
|
||||||
|
val g = Box(f)
|
||||||
|
val r = g.x.isString()
|
||||||
|
|
||||||
|
if (!r) return "Fail"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
+10
@@ -11353,6 +11353,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
runTest("compiler/testData/codegen/box/inlineClasses/kt25246.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/kt25246.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt25771.kt")
|
||||||
|
public void testKt25771() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/kt25771.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("noAssertionsOnInlineClassBasedOnNullableType.kt")
|
@TestMetadata("noAssertionsOnInlineClassBasedOnNullableType.kt")
|
||||||
public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception {
|
public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/inlineClasses/noAssertionsOnInlineClassBasedOnNullableType.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/noAssertionsOnInlineClassBasedOnNullableType.kt");
|
||||||
@@ -11398,6 +11403,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
runTest("compiler/testData/codegen/box/inlineClasses/UIntArraySortExample.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/UIntArraySortExample.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("unboxReceiverOnCallingMethodFromInlineClass.kt")
|
||||||
|
public void testUnboxReceiverOnCallingMethodFromInlineClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/unboxReceiverOnCallingMethodFromInlineClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("useInlineClassesInsideElvisOperator.kt")
|
@TestMetadata("useInlineClassesInsideElvisOperator.kt")
|
||||||
public void testUseInlineClassesInsideElvisOperator() throws Exception {
|
public void testUseInlineClassesInsideElvisOperator() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/inlineClasses/useInlineClassesInsideElvisOperator.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/useInlineClassesInsideElvisOperator.kt");
|
||||||
|
|||||||
+10
@@ -11353,6 +11353,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
|||||||
runTest("compiler/testData/codegen/box/inlineClasses/kt25246.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/kt25246.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt25771.kt")
|
||||||
|
public void testKt25771() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/kt25771.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("noAssertionsOnInlineClassBasedOnNullableType.kt")
|
@TestMetadata("noAssertionsOnInlineClassBasedOnNullableType.kt")
|
||||||
public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception {
|
public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/inlineClasses/noAssertionsOnInlineClassBasedOnNullableType.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/noAssertionsOnInlineClassBasedOnNullableType.kt");
|
||||||
@@ -11398,6 +11403,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
|||||||
runTest("compiler/testData/codegen/box/inlineClasses/UIntArraySortExample.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/UIntArraySortExample.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("unboxReceiverOnCallingMethodFromInlineClass.kt")
|
||||||
|
public void testUnboxReceiverOnCallingMethodFromInlineClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/unboxReceiverOnCallingMethodFromInlineClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("useInlineClassesInsideElvisOperator.kt")
|
@TestMetadata("useInlineClassesInsideElvisOperator.kt")
|
||||||
public void testUseInlineClassesInsideElvisOperator() throws Exception {
|
public void testUseInlineClassesInsideElvisOperator() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/inlineClasses/useInlineClassesInsideElvisOperator.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/useInlineClassesInsideElvisOperator.kt");
|
||||||
|
|||||||
+10
@@ -11353,6 +11353,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
runTest("compiler/testData/codegen/box/inlineClasses/kt25246.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/kt25246.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt25771.kt")
|
||||||
|
public void testKt25771() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/kt25771.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("noAssertionsOnInlineClassBasedOnNullableType.kt")
|
@TestMetadata("noAssertionsOnInlineClassBasedOnNullableType.kt")
|
||||||
public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception {
|
public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/inlineClasses/noAssertionsOnInlineClassBasedOnNullableType.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/noAssertionsOnInlineClassBasedOnNullableType.kt");
|
||||||
@@ -11398,6 +11403,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
runTest("compiler/testData/codegen/box/inlineClasses/UIntArraySortExample.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/UIntArraySortExample.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("unboxReceiverOnCallingMethodFromInlineClass.kt")
|
||||||
|
public void testUnboxReceiverOnCallingMethodFromInlineClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/unboxReceiverOnCallingMethodFromInlineClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("useInlineClassesInsideElvisOperator.kt")
|
@TestMetadata("useInlineClassesInsideElvisOperator.kt")
|
||||||
public void testUseInlineClassesInsideElvisOperator() throws Exception {
|
public void testUseInlineClassesInsideElvisOperator() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/inlineClasses/useInlineClassesInsideElvisOperator.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/useInlineClassesInsideElvisOperator.kt");
|
||||||
|
|||||||
+10
@@ -9983,6 +9983,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
|
|||||||
runTest("compiler/testData/codegen/box/inlineClasses/kt25246.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/kt25246.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt25771.kt")
|
||||||
|
public void testKt25771() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/kt25771.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("noAssertionsOnInlineClassBasedOnNullableType.kt")
|
@TestMetadata("noAssertionsOnInlineClassBasedOnNullableType.kt")
|
||||||
public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception {
|
public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/inlineClasses/noAssertionsOnInlineClassBasedOnNullableType.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/noAssertionsOnInlineClassBasedOnNullableType.kt");
|
||||||
@@ -10028,6 +10033,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
|
|||||||
runTest("compiler/testData/codegen/box/inlineClasses/UIntArraySortExample.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/UIntArraySortExample.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("unboxReceiverOnCallingMethodFromInlineClass.kt")
|
||||||
|
public void testUnboxReceiverOnCallingMethodFromInlineClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/unboxReceiverOnCallingMethodFromInlineClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("useInlineClassesInsideElvisOperator.kt")
|
@TestMetadata("useInlineClassesInsideElvisOperator.kt")
|
||||||
public void testUseInlineClassesInsideElvisOperator() throws Exception {
|
public void testUseInlineClassesInsideElvisOperator() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/inlineClasses/useInlineClassesInsideElvisOperator.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/useInlineClassesInsideElvisOperator.kt");
|
||||||
|
|||||||
+10
@@ -10978,6 +10978,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
|
|||||||
runTest("compiler/testData/codegen/box/inlineClasses/kt25246.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/kt25246.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt25771.kt")
|
||||||
|
public void testKt25771() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/kt25771.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("noAssertionsOnInlineClassBasedOnNullableType.kt")
|
@TestMetadata("noAssertionsOnInlineClassBasedOnNullableType.kt")
|
||||||
public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception {
|
public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/inlineClasses/noAssertionsOnInlineClassBasedOnNullableType.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/noAssertionsOnInlineClassBasedOnNullableType.kt");
|
||||||
@@ -11023,6 +11028,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
|
|||||||
runTest("compiler/testData/codegen/box/inlineClasses/UIntArraySortExample.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/UIntArraySortExample.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("unboxReceiverOnCallingMethodFromInlineClass.kt")
|
||||||
|
public void testUnboxReceiverOnCallingMethodFromInlineClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/unboxReceiverOnCallingMethodFromInlineClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("useInlineClassesInsideElvisOperator.kt")
|
@TestMetadata("useInlineClassesInsideElvisOperator.kt")
|
||||||
public void testUseInlineClassesInsideElvisOperator() throws Exception {
|
public void testUseInlineClassesInsideElvisOperator() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/inlineClasses/useInlineClassesInsideElvisOperator.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/useInlineClassesInsideElvisOperator.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user