Avoid primitive boxing for 'boxed == primitive' if possible

This makes sense for non-floating-point primitive type
(boolean, char, byte, short, int, long):
floating-point types use specialized versions of 'areEqual'.
This commit is contained in:
Dmitry Petrov
2017-07-13 14:15:09 +03:00
parent 275c758da1
commit 8aacddb9f0
17 changed files with 781 additions and 1 deletions
@@ -0,0 +1,26 @@
var order: String = ""
fun a(i: Int): Int? {
order += "a"
return i
}
fun b(i: Int): Int {
order += "b"
return i
}
inline fun evaluateAndCheckOrder(marker: String, expectedValue: Boolean, expectedOrder: String, expr: () -> Boolean) {
order = ""
val actualValue = expr()
if (actualValue != expectedValue) throw AssertionError("$marker: Expected: $expectedValue, actual: $actualValue")
if (order != expectedOrder) throw AssertionError("$marker, order: Expected: '$expectedOrder', actual: '$order'")
}
fun box(): String {
evaluateAndCheckOrder("1", true, "ab") { a(1) == b(1) }
evaluateAndCheckOrder("2", true, "ab") { a(1) != b(2) }
evaluateAndCheckOrder("3", true, "ab") { !(a(1) == b(2)) }
evaluateAndCheckOrder("4", true, "ab") { !(a(1) != b(1)) }
return "OK"
}
@@ -0,0 +1,41 @@
// Auto-generated by GeneratePrimitiveEqualityWithNullableTestData. Do not edit!
val nx: Boolean? = true
val nn: Boolean? = null
val x: Boolean = true
val y: Boolean = false
fun box(): String {
val ax: Boolean? = true
val an: Boolean? = null
val bx: Boolean = true
val by: Boolean = false
return when {
nx != true -> "Fail 0"
nx == false -> "Fail 1"
!(nx == true) -> "Fail 2"
!(nx != false) -> "Fail 3"
nx != x -> "Fail 4"
nx == y -> "Fail 5"
!(nx == x) -> "Fail 6"
!(nx != y) -> "Fail 7"
nn == true -> "Fail 8"
!(nn != true) -> "Fail 9"
nn == x -> "Fail 10"
!(nn != x) -> "Fail 11"
ax != true -> "Fail 12"
ax == false -> "Fail 13"
!(ax == true) -> "Fail 14"
!(ax != false) -> "Fail 15"
ax != bx -> "Fail 16"
ax == by -> "Fail 17"
!(ax == bx) -> "Fail 18"
!(ax != by) -> "Fail 19"
an == true -> "Fail 20"
!(an != true) -> "Fail 21"
an == bx -> "Fail 22"
!(an != bx) -> "Fail 23"
else -> "OK"
}
}
@@ -0,0 +1,41 @@
// Auto-generated by GeneratePrimitiveEqualityWithNullableTestData. Do not edit!
val nx: Byte? = 0.toByte()
val nn: Byte? = null
val x: Byte = 0.toByte()
val y: Byte = 1.toByte()
fun box(): String {
val ax: Byte? = 0.toByte()
val an: Byte? = null
val bx: Byte = 0.toByte()
val by: Byte = 1.toByte()
return when {
nx != 0.toByte() -> "Fail 0"
nx == 1.toByte() -> "Fail 1"
!(nx == 0.toByte()) -> "Fail 2"
!(nx != 1.toByte()) -> "Fail 3"
nx != x -> "Fail 4"
nx == y -> "Fail 5"
!(nx == x) -> "Fail 6"
!(nx != y) -> "Fail 7"
nn == 0.toByte() -> "Fail 8"
!(nn != 0.toByte()) -> "Fail 9"
nn == x -> "Fail 10"
!(nn != x) -> "Fail 11"
ax != 0.toByte() -> "Fail 12"
ax == 1.toByte() -> "Fail 13"
!(ax == 0.toByte()) -> "Fail 14"
!(ax != 1.toByte()) -> "Fail 15"
ax != bx -> "Fail 16"
ax == by -> "Fail 17"
!(ax == bx) -> "Fail 18"
!(ax != by) -> "Fail 19"
an == 0.toByte() -> "Fail 20"
!(an != 0.toByte()) -> "Fail 21"
an == bx -> "Fail 22"
!(an != bx) -> "Fail 23"
else -> "OK"
}
}
@@ -0,0 +1,41 @@
// Auto-generated by GeneratePrimitiveEqualityWithNullableTestData. Do not edit!
val nx: Char? = '0'
val nn: Char? = null
val x: Char = '0'
val y: Char = '1'
fun box(): String {
val ax: Char? = '0'
val an: Char? = null
val bx: Char = '0'
val by: Char = '1'
return when {
nx != '0' -> "Fail 0"
nx == '1' -> "Fail 1"
!(nx == '0') -> "Fail 2"
!(nx != '1') -> "Fail 3"
nx != x -> "Fail 4"
nx == y -> "Fail 5"
!(nx == x) -> "Fail 6"
!(nx != y) -> "Fail 7"
nn == '0' -> "Fail 8"
!(nn != '0') -> "Fail 9"
nn == x -> "Fail 10"
!(nn != x) -> "Fail 11"
ax != '0' -> "Fail 12"
ax == '1' -> "Fail 13"
!(ax == '0') -> "Fail 14"
!(ax != '1') -> "Fail 15"
ax != bx -> "Fail 16"
ax == by -> "Fail 17"
!(ax == bx) -> "Fail 18"
!(ax != by) -> "Fail 19"
an == '0' -> "Fail 20"
!(an != '0') -> "Fail 21"
an == bx -> "Fail 22"
!(an != bx) -> "Fail 23"
else -> "OK"
}
}
@@ -0,0 +1,41 @@
// Auto-generated by GeneratePrimitiveEqualityWithNullableTestData. Do not edit!
val nx: Int? = 0
val nn: Int? = null
val x: Int = 0
val y: Int = 1
fun box(): String {
val ax: Int? = 0
val an: Int? = null
val bx: Int = 0
val by: Int = 1
return when {
nx != 0 -> "Fail 0"
nx == 1 -> "Fail 1"
!(nx == 0) -> "Fail 2"
!(nx != 1) -> "Fail 3"
nx != x -> "Fail 4"
nx == y -> "Fail 5"
!(nx == x) -> "Fail 6"
!(nx != y) -> "Fail 7"
nn == 0 -> "Fail 8"
!(nn != 0) -> "Fail 9"
nn == x -> "Fail 10"
!(nn != x) -> "Fail 11"
ax != 0 -> "Fail 12"
ax == 1 -> "Fail 13"
!(ax == 0) -> "Fail 14"
!(ax != 1) -> "Fail 15"
ax != bx -> "Fail 16"
ax == by -> "Fail 17"
!(ax == bx) -> "Fail 18"
!(ax != by) -> "Fail 19"
an == 0 -> "Fail 20"
!(an != 0) -> "Fail 21"
an == bx -> "Fail 22"
!(an != bx) -> "Fail 23"
else -> "OK"
}
}
@@ -0,0 +1,41 @@
// Auto-generated by GeneratePrimitiveEqualityWithNullableTestData. Do not edit!
val nx: Long? = 0L
val nn: Long? = null
val x: Long = 0L
val y: Long = 1L
fun box(): String {
val ax: Long? = 0L
val an: Long? = null
val bx: Long = 0L
val by: Long = 1L
return when {
nx != 0L -> "Fail 0"
nx == 1L -> "Fail 1"
!(nx == 0L) -> "Fail 2"
!(nx != 1L) -> "Fail 3"
nx != x -> "Fail 4"
nx == y -> "Fail 5"
!(nx == x) -> "Fail 6"
!(nx != y) -> "Fail 7"
nn == 0L -> "Fail 8"
!(nn != 0L) -> "Fail 9"
nn == x -> "Fail 10"
!(nn != x) -> "Fail 11"
ax != 0L -> "Fail 12"
ax == 1L -> "Fail 13"
!(ax == 0L) -> "Fail 14"
!(ax != 1L) -> "Fail 15"
ax != bx -> "Fail 16"
ax == by -> "Fail 17"
!(ax == bx) -> "Fail 18"
!(ax != by) -> "Fail 19"
an == 0L -> "Fail 20"
!(an != 0L) -> "Fail 21"
an == bx -> "Fail 22"
!(an != bx) -> "Fail 23"
else -> "OK"
}
}
@@ -0,0 +1,41 @@
// Auto-generated by GeneratePrimitiveEqualityWithNullableTestData. Do not edit!
val nx: Short? = 0.toShort()
val nn: Short? = null
val x: Short = 0.toShort()
val y: Short = 1.toShort()
fun box(): String {
val ax: Short? = 0.toShort()
val an: Short? = null
val bx: Short = 0.toShort()
val by: Short = 1.toShort()
return when {
nx != 0.toShort() -> "Fail 0"
nx == 1.toShort() -> "Fail 1"
!(nx == 0.toShort()) -> "Fail 2"
!(nx != 1.toShort()) -> "Fail 3"
nx != x -> "Fail 4"
nx == y -> "Fail 5"
!(nx == x) -> "Fail 6"
!(nx != y) -> "Fail 7"
nn == 0.toShort() -> "Fail 8"
!(nn != 0.toShort()) -> "Fail 9"
nn == x -> "Fail 10"
!(nn != x) -> "Fail 11"
ax != 0.toShort() -> "Fail 12"
ax == 1.toShort() -> "Fail 13"
!(ax == 0.toShort()) -> "Fail 14"
!(ax != 1.toShort()) -> "Fail 15"
ax != bx -> "Fail 16"
ax == by -> "Fail 17"
!(ax == bx) -> "Fail 18"
!(ax != by) -> "Fail 19"
an == 0.toShort() -> "Fail 20"
!(an != 0.toShort()) -> "Fail 21"
an == bx -> "Fail 22"
!(an != bx) -> "Fail 23"
else -> "OK"
}
}
@@ -0,0 +1,26 @@
fun testBoolean1(a: Boolean?, b: Boolean) = a == b
fun testBoolean2(a: Boolean?, b: Boolean) = a != b
fun testChar1(a: Char?, b: Char) = a == b
fun testChar2(a: Char?, b: Char) = a != b
fun testByte1(a: Byte?, b: Byte) = a == b
fun testByte2(a: Byte?, b: Byte) = a != b
fun testShort1(a: Short?, b: Short) = a == b
fun testShort2(a: Short?, b: Short) = a != b
fun testInt1(a: Int?, b: Int) = a == b
fun testInt2(a: Int?, b: Int) = a != b
fun testLong1(a: Long?, b: Long) = a == b
fun testLong2(a: Long?, b: Long) = a != b
// 2 booleanValue
// 2 charValue
// 2 byteValue
// 2 shortValue
// 2 intValue
// 2 longValue
// 0 valueOf
// 0 areEqual