[JS IR] Introduce intrinsics for slicing array-like objects
This commit is contained in:
@@ -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")
|
||||
|
||||
+11
@@ -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()))
|
||||
}
|
||||
|
||||
@@ -192,6 +192,15 @@ internal fun jsBind(receiver: Any?, target: Any?): Any?
|
||||
@JsIntrinsic
|
||||
internal fun <A> slice(a: A): A
|
||||
|
||||
@JsIntrinsic
|
||||
internal fun <T> jsArrayLike2Array(arrayLike: Any?): Array<T>
|
||||
|
||||
@JsIntrinsic
|
||||
internal fun <T> jsSliceArrayLikeFromIndex(arrayLike: Any?, start: Int): Array<T>
|
||||
|
||||
@JsIntrinsic
|
||||
internal fun <T> jsSliceArrayLikeFromIndexToIndex(arrayLike: Any?, start: Int, end: Int): Array<T>
|
||||
|
||||
@JsIntrinsic
|
||||
internal fun unreachable(): Nothing
|
||||
|
||||
|
||||
Reference in New Issue
Block a user