[JS IR] Introduce intrinsics for slicing array-like objects

This commit is contained in:
Sergej Jaskiewicz
2021-12-22 19:04:22 +03:00
committed by Space
parent 08e6116ecb
commit d5e46e0607
3 changed files with 27 additions and 0 deletions
@@ -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")
@@ -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