Make generation of assertions for platform types aware of kotlin types

#KT-26859 Fixed
This commit is contained in:
Mikhail Zarechenskiy
2018-09-17 10:59:26 +03:00
parent 03ea8603ce
commit fa9a3868b7
7 changed files with 47 additions and 3 deletions
@@ -910,19 +910,20 @@ public class AsmUtil {
if (state.isCallAssertionsDisabled()) return stackValue; if (state.isCallAssertionsDisabled()) return stackValue;
if (runtimeAssertionInfo == null || !runtimeAssertionInfo.getNeedNotNullAssertion()) return stackValue; if (runtimeAssertionInfo == null || !runtimeAssertionInfo.getNeedNotNullAssertion()) return stackValue;
return new StackValue(stackValue.type) { return new StackValue(stackValue.type, stackValue.kotlinType) {
@Override @Override
public void putSelector(@NotNull Type type, @Nullable KotlinType kotlinType, @NotNull InstructionAdapter v) { public void putSelector(@NotNull Type type, @Nullable KotlinType kotlinType, @NotNull InstructionAdapter v) {
Type innerType = stackValue.type; Type innerType = stackValue.type;
stackValue.put(innerType, v); KotlinType innerKotlinType = stackValue.kotlinType;
stackValue.put(innerType, innerKotlinType, v);
if (innerType.getSort() == Type.OBJECT || innerType.getSort() == Type.ARRAY) { if (innerType.getSort() == Type.OBJECT || innerType.getSort() == Type.ARRAY) {
v.dup(); v.dup();
v.visitLdcInsn(runtimeAssertionInfo.getMessage()); v.visitLdcInsn(runtimeAssertionInfo.getMessage());
v.invokestatic(IntrinsicMethods.INTRINSICS_CLASS_NAME, "checkExpressionValueIsNotNull", v.invokestatic(IntrinsicMethods.INTRINSICS_CLASS_NAME, "checkExpressionValueIsNotNull",
"(Ljava/lang/Object;Ljava/lang/String;)V", false); "(Ljava/lang/Object;Ljava/lang/String;)V", false);
} }
StackValue.coerce(innerType, type, v); StackValue.coerce(innerType, innerKotlinType, type, kotlinType, v);
} }
}; };
} }
@@ -0,0 +1,18 @@
// WITH_RUNTIME
// IGNORE_BACKEND: JVM_IR, JS_IR, NATIVE
inline class SnekDirection(val direction: Int) {
companion object {
val Up = SnekDirection(0)
}
}
fun testUnbox() : SnekDirection {
val list = arrayListOf(SnekDirection.Up)
return list[0]
}
fun box(): String {
val a = testUnbox()
return if (a.direction == 0) "OK" else "Fail"
}
@@ -11844,6 +11844,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTest("compiler/testData/codegen/box/inlineClasses/unboxReceiverOnCallingMethodFromInlineClass.kt"); runTest("compiler/testData/codegen/box/inlineClasses/unboxReceiverOnCallingMethodFromInlineClass.kt");
} }
@TestMetadata("unboxValueFromPlatformType.kt")
public void testUnboxValueFromPlatformType() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/unboxValueFromPlatformType.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");
@@ -11844,6 +11844,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/inlineClasses/unboxReceiverOnCallingMethodFromInlineClass.kt"); runTest("compiler/testData/codegen/box/inlineClasses/unboxReceiverOnCallingMethodFromInlineClass.kt");
} }
@TestMetadata("unboxValueFromPlatformType.kt")
public void testUnboxValueFromPlatformType() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/unboxValueFromPlatformType.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");
@@ -11849,6 +11849,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/inlineClasses/unboxReceiverOnCallingMethodFromInlineClass.kt"); runTest("compiler/testData/codegen/box/inlineClasses/unboxReceiverOnCallingMethodFromInlineClass.kt");
} }
@TestMetadata("unboxValueFromPlatformType.kt")
public void testUnboxValueFromPlatformType() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/unboxValueFromPlatformType.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");
@@ -10379,6 +10379,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/inlineClasses/unboxReceiverOnCallingMethodFromInlineClass.kt"); runTest("compiler/testData/codegen/box/inlineClasses/unboxReceiverOnCallingMethodFromInlineClass.kt");
} }
@TestMetadata("unboxValueFromPlatformType.kt")
public void testUnboxValueFromPlatformType() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/unboxValueFromPlatformType.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");
@@ -11444,6 +11444,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/inlineClasses/unboxReceiverOnCallingMethodFromInlineClass.kt"); runTest("compiler/testData/codegen/box/inlineClasses/unboxReceiverOnCallingMethodFromInlineClass.kt");
} }
@TestMetadata("unboxValueFromPlatformType.kt")
public void testUnboxValueFromPlatformType() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/unboxValueFromPlatformType.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");