From d9c5f100dbb626fbfb2d89ee12d170fef49514bb Mon Sep 17 00:00:00 2001 From: Artem Kobzar Date: Mon, 19 Sep 2022 13:04:16 +0000 Subject: [PATCH] [K/JS] Use intrinsics instead of new functions in IR backend. --- libraries/stdlib/api/js/kotlin.js.kt | 2 +- .../stdlib/js-ir/runtime/jsIntrinsics.kt | 6 +++- .../stdlib/js-ir/runtime/runtimeForStdLib.kt | 26 ++++++++++++++ .../stdlib/js-ir/src/kotlin/jsOperators.kt | 35 ------------------- 4 files changed, 32 insertions(+), 37 deletions(-) create mode 100644 libraries/stdlib/js-ir/runtime/runtimeForStdLib.kt delete mode 100644 libraries/stdlib/js-ir/src/kotlin/jsOperators.kt diff --git a/libraries/stdlib/api/js/kotlin.js.kt b/libraries/stdlib/api/js/kotlin.js.kt index c90a6fd6a84..8152c55d2f3 100644 --- a/libraries/stdlib/api/js/kotlin.js.kt +++ b/libraries/stdlib/api/js/kotlin.js.kt @@ -17,7 +17,7 @@ public external fun eval(expr: kotlin.String): dynamic public external fun js(code: kotlin.String): dynamic -/*∆*/ public fun jsTypeOf(value_hack: kotlin.Any?): kotlin.String +/*∆*/ public external fun jsTypeOf(a: kotlin.Any?): kotlin.String public fun json(vararg pairs: kotlin.Pair): kotlin.js.Json diff --git a/libraries/stdlib/js-ir/runtime/jsIntrinsics.kt b/libraries/stdlib/js-ir/runtime/jsIntrinsics.kt index da24ad11a04..adb027e3c60 100644 --- a/libraries/stdlib/js-ir/runtime/jsIntrinsics.kt +++ b/libraries/stdlib/js-ir/runtime/jsIntrinsics.kt @@ -117,6 +117,10 @@ internal fun jsBitShiftL(a: Any?, b: Any?): Int @JsIntrinsic internal fun jsInstanceOfIntrinsic(a: Any?, b: Any?): Boolean +// @JsIntrinsic +// To prevent people to insert @OptIn every time +public external fun jsTypeOf(a: Any?): String + @JsIntrinsic internal fun jsNewTarget(a: Any?): Any? @@ -216,4 +220,4 @@ internal fun jsClassIntrinsic(): JsClass internal fun jsInIntrinsic(lhs: Any?, rhs: Any): Boolean @JsIntrinsic -internal fun jsDelete(e: Any?) +internal fun jsDelete(e: Any?) \ No newline at end of file diff --git a/libraries/stdlib/js-ir/runtime/runtimeForStdLib.kt b/libraries/stdlib/js-ir/runtime/runtimeForStdLib.kt new file mode 100644 index 00000000000..f0bd1d82c88 --- /dev/null +++ b/libraries/stdlib/js-ir/runtime/runtimeForStdLib.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ +package kotlin.js + +// Inlined intrinsics for backward compatibility with already implemented functions in stdlib for old JS backend +@OptIn(JsIntrinsic::class) +@kotlin.internal.InlineOnly +internal inline fun jsDeleteProperty(obj: dynamic, property: Any) = jsDelete(obj[property]) + +@OptIn(JsIntrinsic::class) +@kotlin.internal.InlineOnly +internal inline fun jsBitwiseOr(lhs: Any?, rhs: Any?): Int = jsBitOr(lhs, rhs) + +@OptIn(JsIntrinsic::class) +@kotlin.internal.InlineOnly +internal inline fun jsBitwiseAnd(lhs: Any?, rhs: Any?): Int = jsBitAnd(lhs, rhs) + +@OptIn(JsIntrinsic::class) +@kotlin.internal.InlineOnly +internal inline fun jsInstanceOf(obj: Any?, jsClass: Any?): Boolean = jsInstanceOfIntrinsic(obj, jsClass) + +@OptIn(JsIntrinsic::class) +@kotlin.internal.InlineOnly +internal inline fun jsIn(lhs: Any?, rhs: Any): Boolean = jsInIntrinsic(lhs, rhs) diff --git a/libraries/stdlib/js-ir/src/kotlin/jsOperators.kt b/libraries/stdlib/js-ir/src/kotlin/jsOperators.kt deleted file mode 100644 index a97d5e9f464..00000000000 --- a/libraries/stdlib/js-ir/src/kotlin/jsOperators.kt +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license - * that can be found in the license/LICENSE.txt file. - */ - -@file:Suppress("UNUSED_PARAMETER") - -package kotlin.js - -// Parameters are suffixed with `_hack` as a workaround for Namer. -// TODO: Implemet as compiler intrinsics - -/** - * Function corresponding to JavaScript's `typeof` operator - */ -public fun jsTypeOf(value_hack: Any?): String = - js("typeof value_hack").unsafeCast() - -internal fun jsDeleteProperty(obj_hack: Any, property_hack: Any) { - js("delete obj_hack[property_hack]") -} - -internal fun jsBitwiseOr(lhs_hack: Any?, rhs_hack: Any?): Int = - js("lhs_hack | rhs_hack").unsafeCast() - -internal fun jsBitwiseAnd(lhs_hack: Any?, rhs_hack: Any?): Int = - js("lhs_hack & rhs_hack").unsafeCast() - -internal fun jsInstanceOf(obj_hack: Any?, jsClass_hack: Any?): Boolean = - js("obj_hack instanceof jsClass_hack").unsafeCast() - -// Returns true if the specified property is in the specified object or its prototype chain. -internal fun jsIn(lhs_hack: Any?, rhs_hack: Any): Boolean = - js("lhs_hack in rhs_hack").unsafeCast() -