Check that boxing instruction is simple call

like T.valueOf(unboxType(T))

 #KT-6047 fixed
This commit is contained in:
Denis Zharkov
2014-10-16 23:12:56 +04:00
committed by Alexander Udalov
parent 34269e1a3e
commit ec63394121
3 changed files with 30 additions and 2 deletions
@@ -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(
@@ -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"
}
@@ -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");