[JS IR BE] Fix arrays type checks

This commit is contained in:
Svyatoslav Kuzmich
2019-02-07 19:26:16 +03:00
parent 9d4e161324
commit 53d15ea27c
2 changed files with 10 additions and 6 deletions
@@ -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")
)
@@ -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<Boolean>()
}
public fun isArray(obj: Any): Boolean {
return isJsArray(obj) && js("!obj.\$type\$").unsafeCast<Boolean>()
}
public fun isArrayish(o: dynamic) =
isArray(o) || js("ArrayBuffer.isView(o)").unsafeCast<Boolean>()
isJsArray(o) || js("ArrayBuffer.isView(o)").unsafeCast<Boolean>()
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<Boolean>()
public fun isShortArray(a: dynamic): Boolean = js("a instanceof Int16Array").unsafeCast<Boolean>()
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<Boolean>()
public fun isFloatArray(a: dynamic): Boolean = js("a instanceof Float32Array").unsafeCast<Boolean>()
public fun isDoubleArray(a: dynamic): Boolean = js("a instanceof Float64Array").unsafeCast<Boolean>()
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")