Do not optimize == for KClasses in redundant boxing elimination
For primitive wrappers such as java.lang.Integer, jlc = java.lang.Integer.class jlt = java.lang.Integer.TYPE !(ljc.equals(ljt)) However, in Kotlin corresponding KClass instances are equal. #KT-17748 Fixed Target versions 1.1.50 #KT-17879 Fixed Target versions 1.1.50
This commit is contained in:
+3
-4
@@ -233,11 +233,10 @@ fun AbstractInsnNode.isAreEqualIntrinsic() =
|
|||||||
desc == "(Ljava/lang/Object;Ljava/lang/Object;)Z"
|
desc == "(Ljava/lang/Object;Ljava/lang/Object;)Z"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val shouldUseEqualsForWrappers = setOf(Type.DOUBLE_TYPE, Type.FLOAT_TYPE, AsmTypes.JAVA_CLASS_TYPE)
|
||||||
|
|
||||||
fun canValuesBeUnboxedForAreEqual(values: List<BasicValue>): Boolean =
|
fun canValuesBeUnboxedForAreEqual(values: List<BasicValue>): Boolean =
|
||||||
!values.any {
|
values.none { getUnboxedType(it.type) in shouldUseEqualsForWrappers }
|
||||||
val unboxedType = getUnboxedType(it.type)
|
|
||||||
unboxedType == Type.DOUBLE_TYPE || unboxedType == Type.FLOAT_TYPE
|
|
||||||
}
|
|
||||||
|
|
||||||
fun AbstractInsnNode.isJavaLangComparableCompareToForSameTypedBoxedValues(values: List<BasicValue>) =
|
fun AbstractInsnNode.isJavaLangComparableCompareToForSameTypedBoxedValues(values: List<BasicValue>) =
|
||||||
isJavaLangComparableCompareTo() && areSameTypedBoxedValues(values)
|
isJavaLangComparableCompareTo() && areSameTypedBoxedValues(values)
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
// IGNORE_BACKEND: JS, NATIVE
|
||||||
|
|
||||||
|
fun test(a: Any) = when (a::class) {
|
||||||
|
String::class -> "String"
|
||||||
|
Int::class -> "Int"
|
||||||
|
Boolean::class -> "Boolean"
|
||||||
|
else -> "Else"
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val s = ""
|
||||||
|
val i = 0
|
||||||
|
val b = false
|
||||||
|
|
||||||
|
if (test(s) != "String") return "Fail 1"
|
||||||
|
if (test(i) != "Int") return "Fail 2"
|
||||||
|
if (test(b) != "Boolean") return "Fail 3"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
// IGNORE_BACKEND: JS, NATIVE
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
42.doSwitchInt()
|
||||||
|
"".doSwitchString()
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun <reified E> E.doSwitchInt(): String = when (E::class) {
|
||||||
|
Int::class -> "success!"
|
||||||
|
else -> throw AssertionError()
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun <reified E> E.doSwitchString(): String = when(E::class) {
|
||||||
|
String::class -> "success!"
|
||||||
|
else -> throw AssertionError()
|
||||||
|
}
|
||||||
+12
@@ -950,12 +950,24 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kClassEquals.kt")
|
||||||
|
public void testKClassEquals() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/boxingOptimization/kClassEquals.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt15871.kt")
|
@TestMetadata("kt15871.kt")
|
||||||
public void testKt15871() throws Exception {
|
public void testKt15871() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/boxingOptimization/kt15871.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/boxingOptimization/kt15871.kt");
|
||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt17748.kt")
|
||||||
|
public void testKt17748() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/boxingOptimization/kt17748.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt19767.kt")
|
@TestMetadata("kt19767.kt")
|
||||||
public void testKt19767() throws Exception {
|
public void testKt19767() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/boxingOptimization/kt19767.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/boxingOptimization/kt19767.kt");
|
||||||
|
|||||||
@@ -950,12 +950,24 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kClassEquals.kt")
|
||||||
|
public void testKClassEquals() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/boxingOptimization/kClassEquals.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt15871.kt")
|
@TestMetadata("kt15871.kt")
|
||||||
public void testKt15871() throws Exception {
|
public void testKt15871() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/boxingOptimization/kt15871.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/boxingOptimization/kt15871.kt");
|
||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt17748.kt")
|
||||||
|
public void testKt17748() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/boxingOptimization/kt17748.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt19767.kt")
|
@TestMetadata("kt19767.kt")
|
||||||
public void testKt19767() throws Exception {
|
public void testKt19767() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/boxingOptimization/kt19767.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/boxingOptimization/kt19767.kt");
|
||||||
|
|||||||
@@ -950,12 +950,24 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kClassEquals.kt")
|
||||||
|
public void testKClassEquals() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/boxingOptimization/kClassEquals.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt15871.kt")
|
@TestMetadata("kt15871.kt")
|
||||||
public void testKt15871() throws Exception {
|
public void testKt15871() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/boxingOptimization/kt15871.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/boxingOptimization/kt15871.kt");
|
||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt17748.kt")
|
||||||
|
public void testKt17748() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/boxingOptimization/kt17748.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt19767.kt")
|
@TestMetadata("kt19767.kt")
|
||||||
public void testKt19767() throws Exception {
|
public void testKt19767() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/boxingOptimization/kt19767.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/boxingOptimization/kt19767.kt");
|
||||||
|
|||||||
+24
@@ -1148,12 +1148,36 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kClassEquals.kt")
|
||||||
|
public void testKClassEquals() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/boxingOptimization/kClassEquals.kt");
|
||||||
|
try {
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
catch (Throwable ignore) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
throw new AssertionError("Looks like this test can be unmuted. Remove IGNORE_BACKEND directive for that.");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt15871.kt")
|
@TestMetadata("kt15871.kt")
|
||||||
public void testKt15871() throws Exception {
|
public void testKt15871() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/boxingOptimization/kt15871.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/boxingOptimization/kt15871.kt");
|
||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt17748.kt")
|
||||||
|
public void testKt17748() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/boxingOptimization/kt17748.kt");
|
||||||
|
try {
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
catch (Throwable ignore) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
throw new AssertionError("Looks like this test can be unmuted. Remove IGNORE_BACKEND directive for that.");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt19767.kt")
|
@TestMetadata("kt19767.kt")
|
||||||
public void testKt19767() throws Exception {
|
public void testKt19767() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/boxingOptimization/kt19767.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/boxingOptimization/kt19767.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user