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 d6aa150d9b2..c52187b2015 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 @@ -242,6 +242,13 @@ class JsIntrinsics(private val irBuiltIns: IrBuiltIns, val context: JsIrBackendC val jsClass = getInternalFunction("jsClassIntrinsic") val arrayLiteral: IrSimpleFunctionSymbol = getInternalFunction("arrayLiteral") + // The following 3 functions are all lowered into [].slice.call(...), they only differ + // in the number of arguments. + // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice + val jsArrayLike2Array = getInternalFunction("jsArrayLike2Array") + val jsSliceArrayLikeFromIndex = getInternalFunction("jsSliceArrayLikeFromIndex") + val jsSliceArrayLikeFromIndexToIndex = getInternalFunction("jsSliceArrayLikeFromIndexToIndex") + internal inner class JsReflectionSymbols : ReflectionSymbols { override val createKType = getInternalWithoutPackageOrNull("createKType") override val createDynamicKType = getInternalWithoutPackageOrNull("createDynamicKType") diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsIntrinsicTransformers.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsIntrinsicTransformers.kt index ab1fb6dbd4d..e1b7be8cb7f 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsIntrinsicTransformers.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsIntrinsicTransformers.kt @@ -154,6 +154,17 @@ class JsIntrinsicTransformers(backendContext: JsIrBackendContext) { translateCallArguments(call, context).single() } + for (intrinsic in arrayOf( + intrinsics.jsArrayLike2Array, + intrinsics.jsSliceArrayLikeFromIndex, + intrinsics.jsSliceArrayLikeFromIndexToIndex + )) { + add(intrinsic) { call, context -> + val args = translateCallArguments(call, context) + JsInvocation(JsNameRef(Namer.CALL_FUNCTION, JsNameRef(Namer.SLICE_FUNCTION, JsArrayLiteral())), args) + } + } + add(intrinsics.jsArraySlice) { call, context -> JsInvocation(JsNameRef(Namer.SLICE_FUNCTION, translateCallArguments(call, context).single())) } diff --git a/libraries/stdlib/js-ir/runtime/jsIntrinsics.kt b/libraries/stdlib/js-ir/runtime/jsIntrinsics.kt index 34f08cf7297..da24ad11a04 100644 --- a/libraries/stdlib/js-ir/runtime/jsIntrinsics.kt +++ b/libraries/stdlib/js-ir/runtime/jsIntrinsics.kt @@ -192,6 +192,15 @@ internal fun jsBind(receiver: Any?, target: Any?): Any? @JsIntrinsic internal fun slice(a: A): A +@JsIntrinsic +internal fun jsArrayLike2Array(arrayLike: Any?): Array + +@JsIntrinsic +internal fun jsSliceArrayLikeFromIndex(arrayLike: Any?, start: Int): Array + +@JsIntrinsic +internal fun jsSliceArrayLikeFromIndexToIndex(arrayLike: Any?, start: Int, end: Int): Array + @JsIntrinsic internal fun unreachable(): Nothing