[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 jsClass = getInternalFunction("jsClassIntrinsic")
|
||||||
val arrayLiteral: IrSimpleFunctionSymbol = getInternalFunction("arrayLiteral")
|
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 {
|
internal inner class JsReflectionSymbols : ReflectionSymbols {
|
||||||
override val createKType = getInternalWithoutPackageOrNull("createKType")
|
override val createKType = getInternalWithoutPackageOrNull("createKType")
|
||||||
override val createDynamicKType = getInternalWithoutPackageOrNull("createDynamicKType")
|
override val createDynamicKType = getInternalWithoutPackageOrNull("createDynamicKType")
|
||||||
|
|||||||
+11
@@ -154,6 +154,17 @@ class JsIntrinsicTransformers(backendContext: JsIrBackendContext) {
|
|||||||
translateCallArguments(call, context).single()
|
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 ->
|
add(intrinsics.jsArraySlice) { call, context ->
|
||||||
JsInvocation(JsNameRef(Namer.SLICE_FUNCTION, translateCallArguments(call, context).single()))
|
JsInvocation(JsNameRef(Namer.SLICE_FUNCTION, translateCallArguments(call, context).single()))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -192,6 +192,15 @@ internal fun jsBind(receiver: Any?, target: Any?): Any?
|
|||||||
@JsIntrinsic
|
@JsIntrinsic
|
||||||
internal fun <A> slice(a: A): A
|
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
|
@JsIntrinsic
|
||||||
internal fun unreachable(): Nothing
|
internal fun unreachable(): Nothing
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user