From ec63394121e1d87501efc1f8d4a7608b7284b96f Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Thu, 16 Oct 2014 23:12:56 +0400 Subject: [PATCH] Check that boxing instruction is simple call like T.valueOf(unboxType(T)) #KT-6047 fixed --- .../optimization/boxing/BoxingInterpreter.java | 8 ++++++-- .../boxWithStdlib/boxingOptimization/kt6047.kt | 18 ++++++++++++++++++ ...BlackBoxWithStdlibCodegenTestGenerated.java | 6 ++++++ 3 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/codegen/boxWithStdlib/boxingOptimization/kt6047.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/optimization/boxing/BoxingInterpreter.java b/compiler/backend/src/org/jetbrains/jet/codegen/optimization/boxing/BoxingInterpreter.java index 8e0634a1ef8..39ac49a3168 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/optimization/boxing/BoxingInterpreter.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/optimization/boxing/BoxingInterpreter.java @@ -144,9 +144,13 @@ public class BoxingInterpreter extends OptimizationBasicInterpreter { private static boolean isBoxing(@NotNull AbstractInsnNode insn) { if (insn.getOpcode() != Opcodes.INVOKESTATIC) return false; - MethodInsnNode methodInsnNode = (MethodInsnNode) insn; + MethodInsnNode node = (MethodInsnNode) insn; - return isWrapperClassName(methodInsnNode.owner) && "valueOf".equals(methodInsnNode.name); + return isWrapperClassName(node.owner) && "valueOf".equals(node.name) && + Type.getMethodDescriptor( + Type.getObjectType(node.owner), + AsmUtil.unboxType(Type.getObjectType(node.owner)) + ).equals(node.desc); } private static boolean isNextMethodCallOfProgressionIterator( diff --git a/compiler/testData/codegen/boxWithStdlib/boxingOptimization/kt6047.kt b/compiler/testData/codegen/boxWithStdlib/boxingOptimization/kt6047.kt new file mode 100644 index 00000000000..e1d582770b3 --- /dev/null +++ b/compiler/testData/codegen/boxWithStdlib/boxingOptimization/kt6047.kt @@ -0,0 +1,18 @@ +import kotlin.test.assertEquals + +fun checkLongAB5E(x: Long) = assertEquals(0xAB5EL, x) +fun checkDouble1(y: Double) = assertEquals(1.0, y) +fun checkByte10(z: Byte) = assertEquals(10.toByte(), z) + +fun box(): String { + val x = java.lang.Long.valueOf("AB5E", 16) + checkLongAB5E(x) + + val y = java.lang.Double.valueOf("1.0") + checkDouble1(y) + + val z = java.lang.Byte.valueOf("A", 16) + checkByte10(z) + + return "OK" +} diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java index f4794bbb836..1948b9ea388 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java @@ -181,6 +181,12 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode doTestWithStdlib(fileName); } + @TestMetadata("kt6047.kt") + public void testKt6047() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/boxingOptimization/kt6047.kt"); + doTestWithStdlib(fileName); + } + @TestMetadata("nullCheck.kt") public void testNullCheck() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/boxingOptimization/nullCheck.kt");