diff --git a/js/js.translator/testData/box/standardClasses/charArrayGetSet.kt b/js/js.translator/testData/box/standardClasses/charArrayGetSet.kt index 86acb5ea2ab..12781d34014 100644 --- a/js/js.translator/testData/box/standardClasses/charArrayGetSet.kt +++ b/js/js.translator/testData/box/standardClasses/charArrayGetSet.kt @@ -23,5 +23,21 @@ fun box(): String { val bType3 = jsTypeOf(b[0].asDynamic()) if (bType3 != "number") return "fail6: $bType3" + if (a.asDynamic().constructor.name != "Uint16Array") return "fail7: ${a.asDynamic().constructor.name}" + if (b.asDynamic().constructor.name != "Array") return "fail8: ${b.asDynamic().constructor.name}" + + val c = charArrayOf('Q') + val cType = jsTypeOf(c.asDynamic()[0]) + if (cType != "number") return "fail9: $cType" + + c[0] = 'W' + val cType2 = jsTypeOf(c.asDynamic()[0]) + if (cType2 != "number") return "fail10: $cType2" + + val cType3 = jsTypeOf(c[0].asDynamic()) + if (cType3 != "number") return "fail11: $cType3" + + if (c.asDynamic().constructor.name != "Uint16Array") return "fail12: ${c.asDynamic().constructor.name}" + return "OK" -} \ No newline at end of file +} diff --git a/libraries/stdlib/js-ir/runtime/arrays.kt b/libraries/stdlib/js-ir/runtime/arrays.kt index a4aad8d4898..6332f06553a 100644 --- a/libraries/stdlib/js-ir/runtime/arrays.kt +++ b/libraries/stdlib/js-ir/runtime/arrays.kt @@ -34,9 +34,11 @@ internal fun booleanArray(size: Int): BooleanArray = withType("BooleanArray", fi internal fun booleanArrayOf(arr: Array): BooleanArray = withType("BooleanArray", arr.asDynamic().slice()).unsafeCast() -internal fun charArray(size: Int): CharArray = withType("CharArray", fillArrayVal(Array(size), 0)).unsafeCast() +@Suppress("UNUSED_PARAMETER") +internal fun charArray(size: Int): CharArray = withType("CharArray", js("new Uint16Array(size)")).unsafeCast() -internal fun charArrayOf(arr: Array): CharArray = withType("CharArray", arr.asDynamic().slice()).unsafeCast() +@Suppress("UNUSED_PARAMETER") +internal fun charArrayOf(arr: Array): CharArray = withType("CharArray", js("new Uint16Array(arr)")).unsafeCast() internal fun longArray(size: Int): LongArray = withType("LongArray", fillArrayVal(Array(size), 0L)).unsafeCast() diff --git a/libraries/stdlib/js-ir/runtime/typeCheckUtils.kt b/libraries/stdlib/js-ir/runtime/typeCheckUtils.kt index 614e2fdb5c8..9bdd6784041 100644 --- a/libraries/stdlib/js-ir/runtime/typeCheckUtils.kt +++ b/libraries/stdlib/js-ir/runtime/typeCheckUtils.kt @@ -129,7 +129,7 @@ internal fun isChar(@Suppress("UNUSED_PARAMETER") c: Any): Boolean { internal fun isBooleanArray(a: dynamic): Boolean = isJsArray(a) && a.`$type$` === "BooleanArray" internal fun isByteArray(a: dynamic): Boolean = jsInstanceOf(a, js("Int8Array")) internal fun isShortArray(a: dynamic): Boolean = jsInstanceOf(a, js("Int16Array")) -internal fun isCharArray(a: dynamic): Boolean = isJsArray(a) && a.`$type$` === "CharArray" +internal fun isCharArray(a: dynamic): Boolean = jsInstanceOf(a, js("Uint16Array")) && a.`$type$` === "CharArray" internal fun isIntArray(a: dynamic): Boolean = jsInstanceOf(a, js("Int32Array")) internal fun isFloatArray(a: dynamic): Boolean = jsInstanceOf(a, js("Float32Array")) internal fun isDoubleArray(a: dynamic): Boolean = jsInstanceOf(a, js("Float64Array"))