From 53d15ea27c9a51608809062f807932933c787d14 Mon Sep 17 00:00:00 2001 From: Svyatoslav Kuzmich Date: Thu, 7 Feb 2019 19:26:16 +0300 Subject: [PATCH] [JS IR BE] Fix arrays type checks --- .../jetbrains/kotlin/ir/backend/js/JsIntrinsics.kt | 2 +- libraries/stdlib/js/irRuntime/typeCheckUtils.kt | 14 +++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIntrinsics.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIntrinsics.kt index f23f31b2bab..f999136c308 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIntrinsics.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIntrinsics.kt @@ -126,7 +126,7 @@ class JsIntrinsics(private val irBuiltIns: IrBuiltIns, val context: JsIrBackendC PrimitiveType.INT to getInternalFunction("isIntArray"), PrimitiveType.FLOAT to getInternalFunction("isFloatArray"), PrimitiveType.LONG to getInternalFunction("isLongArray"), - PrimitiveType.DOUBLE to getInternalFunction("isLongArray") + PrimitiveType.DOUBLE to getInternalFunction("isDoubleArray") ) diff --git a/libraries/stdlib/js/irRuntime/typeCheckUtils.kt b/libraries/stdlib/js/irRuntime/typeCheckUtils.kt index 8f56d0187ec..435c8cfcf07 100644 --- a/libraries/stdlib/js/irRuntime/typeCheckUtils.kt +++ b/libraries/stdlib/js/irRuntime/typeCheckUtils.kt @@ -90,12 +90,16 @@ fun isObject(obj: dynamic): Boolean { } } -public fun isArray(obj: Any): Boolean { +private fun isJsArray(obj: Any): Boolean { return js("Array.isArray(obj)").unsafeCast() } +public fun isArray(obj: Any): Boolean { + return isJsArray(obj) && js("!obj.\$type\$").unsafeCast() +} + public fun isArrayish(o: dynamic) = - isArray(o) || js("ArrayBuffer.isView(o)").unsafeCast() + isJsArray(o) || js("ArrayBuffer.isView(o)").unsafeCast() public fun isChar(c: Any): Boolean { @@ -103,14 +107,14 @@ public fun isChar(c: Any): Boolean { } // TODO: Distinguish Boolean/Byte and Short/Char -public fun isBooleanArray(a: dynamic): Boolean = isArray(a) && a.`$type$` == "BooleanArray" +public fun isBooleanArray(a: dynamic): Boolean = isJsArray(a) && a.`$type$` == "BooleanArray" public fun isByteArray(a: dynamic): Boolean = js("a instanceof Int8Array").unsafeCast() public fun isShortArray(a: dynamic): Boolean = js("a instanceof Int16Array").unsafeCast() -public fun isCharArray(a: dynamic): Boolean = isArray(a) && a.`$type$` == "CharArray" +public fun isCharArray(a: dynamic): Boolean = isJsArray(a) && a.`$type$` == "CharArray" public fun isIntArray(a: dynamic): Boolean = js("a instanceof Int32Array").unsafeCast() public fun isFloatArray(a: dynamic): Boolean = js("a instanceof Float32Array").unsafeCast() public fun isDoubleArray(a: dynamic): Boolean = js("a instanceof Float64Array").unsafeCast() -public fun isLongArray(a: dynamic): Boolean = isArray(a) && a.`$type$` == "LongArray" +public fun isLongArray(a: dynamic): Boolean = isJsArray(a) && a.`$type$` == "LongArray" internal fun jsIn(x: String, y: dynamic): Boolean = js("x in y")