diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java index a59f36fbd4e..697df31c3ca 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java @@ -281,33 +281,24 @@ public abstract class StackValue { } private static void box(Type type, Type toType, InstructionAdapter v) { - if (type == Type.BYTE_TYPE || toType.getInternalName().equals(NULLABLE_BYTE_TYPE_NAME) && type == Type.INT_TYPE) { - v.cast(type, Type.BYTE_TYPE); - v.invokestatic(NULLABLE_BYTE_TYPE_NAME, "valueOf", "(B)L" + NULLABLE_BYTE_TYPE_NAME + ";", false); - } - else if (type == Type.SHORT_TYPE || toType.getInternalName().equals(NULLABLE_SHORT_TYPE_NAME) && type == Type.INT_TYPE) { - v.cast(type, Type.SHORT_TYPE); - v.invokestatic(NULLABLE_SHORT_TYPE_NAME, "valueOf", "(S)L" + NULLABLE_SHORT_TYPE_NAME + ";", false); - } - else if (type == Type.LONG_TYPE || toType.getInternalName().equals(NULLABLE_LONG_TYPE_NAME) && type == Type.INT_TYPE) { - v.cast(type, Type.LONG_TYPE); - v.invokestatic(NULLABLE_LONG_TYPE_NAME, "valueOf", "(J)L" + NULLABLE_LONG_TYPE_NAME + ";", false); - } - else if (type == Type.INT_TYPE) { - v.invokestatic("java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;", false); - } - else if (type == Type.BOOLEAN_TYPE) { - v.invokestatic("java/lang/Boolean", "valueOf", "(Z)Ljava/lang/Boolean;", false); - } - else if (type == Type.CHAR_TYPE) { - v.invokestatic("java/lang/Character", "valueOf", "(C)Ljava/lang/Character;", false); - } - else if (type == Type.FLOAT_TYPE) { - v.invokestatic("java/lang/Float", "valueOf", "(F)Ljava/lang/Float;", false); - } - else if (type == Type.DOUBLE_TYPE) { - v.invokestatic("java/lang/Double", "valueOf", "(D)Ljava/lang/Double;", false); + if (type == Type.INT_TYPE) { + if (toType.getInternalName().equals(NULLABLE_BYTE_TYPE_NAME)) { + type = Type.BYTE_TYPE; + } + else if (toType.getInternalName().equals(NULLABLE_SHORT_TYPE_NAME)) { + type = Type.SHORT_TYPE; + } + else if (toType.getInternalName().equals(NULLABLE_LONG_TYPE_NAME)) { + type = Type.LONG_TYPE; + } + v.cast(Type.INT_TYPE, type); } + + Type boxedType = AsmUtil.boxType(type); + if (boxedType == type) return; + + v.invokestatic(boxedType.getInternalName(), "valueOf", Type.getMethodDescriptor(boxedType, type), false); + coerce(boxedType, toType, v); } private static void unbox(Type type, InstructionAdapter v) { diff --git a/compiler/testData/codegen/java8/box/jvm8/kt16581.kt b/compiler/testData/codegen/java8/box/jvm8/kt16581.kt new file mode 100644 index 00000000000..15329e1f4d0 --- /dev/null +++ b/compiler/testData/codegen/java8/box/jvm8/kt16581.kt @@ -0,0 +1,9 @@ +// JVM_TARGET: 1.8 +fun failAtRuntime(numberArg: Number = 0.0): Number { + return numberArg +} + +fun box(): String { + failAtRuntime() + return "OK" +} \ No newline at end of file diff --git a/compiler/testData/codegen/java8/box/jvm8/kt16581_2.kt b/compiler/testData/codegen/java8/box/jvm8/kt16581_2.kt new file mode 100644 index 00000000000..79807862f4f --- /dev/null +++ b/compiler/testData/codegen/java8/box/jvm8/kt16581_2.kt @@ -0,0 +1,17 @@ +// JVM_TARGET: 1.8 + +fun test(o: Number) {} + +fun test2(o: Number) { + val p: Int = 1 + val o = if (z < 1) p else o + test(o) +} + +var z = 1 + +fun box(): String { + val x: Number = 1 + test2(x) + return "OK" +} \ No newline at end of file diff --git a/compiler/testData/codegen/java8/box/jvm8/kt16588.kt b/compiler/testData/codegen/java8/box/jvm8/kt16588.kt new file mode 100644 index 00000000000..7bbd29ab2cc --- /dev/null +++ b/compiler/testData/codegen/java8/box/jvm8/kt16588.kt @@ -0,0 +1,12 @@ +// JVM_TARGET: 1.8 + +fun number(doLong: Boolean): Number = when { + doLong -> 1.toLong() + else -> 0 +} + +fun box(): String { + number(true) + return "OK" +} + diff --git a/compiler/tests-java8/tests/org/jetbrains/kotlin/codegen/BlackBoxWithJava8CodegenTestGenerated.java b/compiler/tests-java8/tests/org/jetbrains/kotlin/codegen/BlackBoxWithJava8CodegenTestGenerated.java index ddc46367605..4c500f433e6 100644 --- a/compiler/tests-java8/tests/org/jetbrains/kotlin/codegen/BlackBoxWithJava8CodegenTestGenerated.java +++ b/compiler/tests-java8/tests/org/jetbrains/kotlin/codegen/BlackBoxWithJava8CodegenTestGenerated.java @@ -269,6 +269,24 @@ public class BlackBoxWithJava8CodegenTestGenerated extends AbstractBlackBoxCodeg doTest(fileName); } + @TestMetadata("kt16581.kt") + public void testKt16581() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/java8/box/jvm8/kt16581.kt"); + doTest(fileName); + } + + @TestMetadata("kt16581_2.kt") + public void testKt16581_2() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/java8/box/jvm8/kt16581_2.kt"); + doTest(fileName); + } + + @TestMetadata("kt16588.kt") + public void testKt16588() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/java8/box/jvm8/kt16588.kt"); + doTest(fileName); + } + @TestMetadata("oneImplementation.kt") public void testOneImplementation() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/java8/box/jvm8/oneImplementation.kt");