JS: don't optimize RTTI when possible, i.e. don't remove is and as when object is known at compile time to have type in RHS of expression. Substitute kotlin.Any with Object. Fix #KT-7665, #KT-7664
This commit is contained in:
@@ -1,28 +0,0 @@
|
||||
package foo
|
||||
|
||||
// CHECK_NOT_CALLED_IN_SCOPE: scope=box function=isType
|
||||
|
||||
open class A()
|
||||
|
||||
class B() : A()
|
||||
|
||||
fun box(): String {
|
||||
assertTrue(B() is A)
|
||||
assertTrue(B() is A?)
|
||||
assertTrue(B() is B)
|
||||
assertTrue(B() is B?)
|
||||
assertTrue((B() as B?) is A?)
|
||||
assertTrue((null as A?) is A?)
|
||||
|
||||
assertNotEquals(null, B() as? A)
|
||||
assertNotEquals(null, B() as? A?)
|
||||
assertNotEquals(null, B() as? B)
|
||||
assertNotEquals(null, B() as? B?)
|
||||
|
||||
assertNotEquals(null, B() as A)
|
||||
assertNotEquals(null, B() as A?)
|
||||
assertNotEquals(null, B() as B)
|
||||
assertNotEquals(null, B() as B?)
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
// CHECK_CALLED_IN_SCOPE: function=isType scope=box
|
||||
package foo
|
||||
|
||||
class A : Any()
|
||||
|
||||
fun Any?.asAny() = this
|
||||
|
||||
fun box(): String {
|
||||
val x = Any().asAny()
|
||||
if (x !is Any) return "fail1"
|
||||
if (x.asDynamic().constructor !== js("Object")) return "fail1a"
|
||||
|
||||
if (A().asAny() !is Any) return "fail2"
|
||||
|
||||
if (arrayOf(1, 2, 3).asAny() !is Any) return "fail3"
|
||||
|
||||
if (createNakedObject() is Any) return "fail4"
|
||||
|
||||
if (({ }).asAny() !is Any) return "fail5"
|
||||
|
||||
if ((23).asAny() !is Any) return "fail6"
|
||||
|
||||
if ((3.14).asAny() !is Any) return "fail7"
|
||||
|
||||
if (false.asAny() !is Any) return "fail8"
|
||||
|
||||
if ("bar".asAny() !is Any) return "fail9"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
|
||||
fun createNakedObject(): Any? = js("Object.create(null)")
|
||||
+12
-6
@@ -92,6 +92,18 @@
|
||||
* @returns {Boolean}
|
||||
*/
|
||||
Kotlin.isType = function (object, klass) {
|
||||
if (klass === Object) {
|
||||
switch (typeof object) {
|
||||
case "string":
|
||||
case "number":
|
||||
case "boolean":
|
||||
case "function":
|
||||
return true;
|
||||
default:
|
||||
return object instanceof Object;
|
||||
}
|
||||
}
|
||||
|
||||
if (object == null || klass == null || (typeof object !== 'object' && typeof object !== 'function')) {
|
||||
return false;
|
||||
}
|
||||
@@ -258,12 +270,6 @@
|
||||
return object == null || fn(object);
|
||||
}
|
||||
};
|
||||
|
||||
Kotlin.isAny = function () {
|
||||
return function (object) {
|
||||
return object != null;
|
||||
}
|
||||
};
|
||||
|
||||
Kotlin.andPredicate = function (a, b) {
|
||||
return function (object) {
|
||||
|
||||
Reference in New Issue
Block a user