JS backend: fix equality check for nullable types
* Generate simple check when compare with `null` literal. * Use Kotlin.equals if type of receiver or argument is nullable. * Don't call equals method if any of receiver or argument is null (at runtime, not only literal). For more information see KT-4356. #KT-7530 fixed #KT-7916 fixed
This commit is contained in:
+47
@@ -0,0 +1,47 @@
|
||||
package foo
|
||||
|
||||
class A {
|
||||
override fun equals(other: Any?) = this === other
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
val a: A? = null
|
||||
val b: A? = null
|
||||
val c: A? = A()
|
||||
val d: A? = A()
|
||||
val e: A = A()
|
||||
|
||||
// compare nullable vals with null
|
||||
testTrue { a == b }
|
||||
testTrue { a == a }
|
||||
testFalse { a != b }
|
||||
testFalse { a != a }
|
||||
|
||||
// compare null and non-null inside nullable vals
|
||||
testFalse { a == c }
|
||||
testTrue { a != c }
|
||||
testFalse { c == a }
|
||||
testTrue { c != a }
|
||||
|
||||
// compare nullables vals with non-null
|
||||
testFalse { c == d }
|
||||
testTrue { c == c }
|
||||
testTrue { c != d }
|
||||
testFalse { d == c }
|
||||
testTrue { d != c }
|
||||
testFalse { d != d }
|
||||
|
||||
// compare nullable val with null with non-nullable
|
||||
testFalse { a == e }
|
||||
testTrue { a != e }
|
||||
testFalse { e == a }
|
||||
testTrue { e != a }
|
||||
|
||||
// compare nullable val with non-null with non-nullable
|
||||
testFalse { c == e }
|
||||
testTrue { c != e }
|
||||
testFalse { e == c }
|
||||
testTrue { e != c }
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
package foo
|
||||
|
||||
class A {
|
||||
override fun equals(other: Any?) = super.equals(other)
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
val a: A? = null
|
||||
|
||||
testTrue { a == null }
|
||||
testFalse { a != null }
|
||||
testTrue { null == a }
|
||||
testFalse { null != a }
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package foo
|
||||
|
||||
var log = ""
|
||||
|
||||
class A {
|
||||
override fun equals(o: Any?): Boolean {
|
||||
log += "$o;"
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
val a = A()
|
||||
|
||||
assertTrue(a.equals("aaa"))
|
||||
assertEquals("aaa;", log)
|
||||
assertFalse(a == null)
|
||||
assertEquals("aaa;", log)
|
||||
assertTrue(a.equals(null))
|
||||
assertEquals("aaa;null;", log)
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+4
@@ -47,6 +47,10 @@
|
||||
return obj2 == null;
|
||||
}
|
||||
|
||||
if (obj2 == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (Array.isArray(obj1)) {
|
||||
return Kotlin.arrayEquals(obj1, obj2);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user