Fix coercion for stack value property in case of inline classes

#KT-25771 Fixed
This commit is contained in:
Mikhail Zarechenskiy
2018-08-06 10:15:20 +03:00
parent f89803fe8f
commit 55e7def3c1
8 changed files with 114 additions and 3 deletions
@@ -1478,18 +1478,21 @@ public abstract class StackValue {
}
Type typeOfValueOnStack = getter.getReturnType();
KotlinType kotlinTypeOfValueOnStack = getterDescriptor.getReturnType();
if (DescriptorUtils.isAnnotationClass(descriptor.getContainingDeclaration())) {
if (this.type.equals(K_CLASS_TYPE)) {
wrapJavaClassIntoKClass(v);
typeOfValueOnStack = K_CLASS_TYPE;
kotlinTypeOfValueOnStack = null;
}
else if (this.type.equals(K_CLASS_ARRAY_TYPE)) {
wrapJavaClassesIntoKClasses(v);
typeOfValueOnStack = K_CLASS_ARRAY_TYPE;
kotlinTypeOfValueOnStack = null;
}
}
coerce(typeOfValueOnStack, type, v);
coerce(typeOfValueOnStack, kotlinTypeOfValueOnStack, type, kotlinType, v);
KotlinType returnType = descriptor.getReturnType();
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());
}
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);
Type returnType = setter.getReturnType();
Type returnType = this.setter.getReturnType();
if (returnType != Type.VOID_TYPE) {
pop(v, returnType);
}
+36
View File
@@ -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"
}
@@ -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"
}
@@ -11353,6 +11353,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
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")
public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception {
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");
}
@TestMetadata("unboxReceiverOnCallingMethodFromInlineClass.kt")
public void testUnboxReceiverOnCallingMethodFromInlineClass() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/unboxReceiverOnCallingMethodFromInlineClass.kt");
}
@TestMetadata("useInlineClassesInsideElvisOperator.kt")
public void testUseInlineClassesInsideElvisOperator() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/useInlineClassesInsideElvisOperator.kt");
@@ -11353,6 +11353,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
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")
public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception {
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");
}
@TestMetadata("unboxReceiverOnCallingMethodFromInlineClass.kt")
public void testUnboxReceiverOnCallingMethodFromInlineClass() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/unboxReceiverOnCallingMethodFromInlineClass.kt");
}
@TestMetadata("useInlineClassesInsideElvisOperator.kt")
public void testUseInlineClassesInsideElvisOperator() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/useInlineClassesInsideElvisOperator.kt");
@@ -11353,6 +11353,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
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")
public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception {
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");
}
@TestMetadata("unboxReceiverOnCallingMethodFromInlineClass.kt")
public void testUnboxReceiverOnCallingMethodFromInlineClass() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/unboxReceiverOnCallingMethodFromInlineClass.kt");
}
@TestMetadata("useInlineClassesInsideElvisOperator.kt")
public void testUseInlineClassesInsideElvisOperator() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/useInlineClassesInsideElvisOperator.kt");
@@ -9983,6 +9983,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
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")
public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception {
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");
}
@TestMetadata("unboxReceiverOnCallingMethodFromInlineClass.kt")
public void testUnboxReceiverOnCallingMethodFromInlineClass() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/unboxReceiverOnCallingMethodFromInlineClass.kt");
}
@TestMetadata("useInlineClassesInsideElvisOperator.kt")
public void testUseInlineClassesInsideElvisOperator() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/useInlineClassesInsideElvisOperator.kt");
@@ -10978,6 +10978,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
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")
public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception {
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");
}
@TestMetadata("unboxReceiverOnCallingMethodFromInlineClass.kt")
public void testUnboxReceiverOnCallingMethodFromInlineClass() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/unboxReceiverOnCallingMethodFromInlineClass.kt");
}
@TestMetadata("useInlineClassesInsideElvisOperator.kt")
public void testUseInlineClassesInsideElvisOperator() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/useInlineClassesInsideElvisOperator.kt");