[IR][JS][Wasm] Unbind JsSymbols,WasmSymbols from Context
^KT-73108 Fixed
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt
index c817297..7e10f25 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt
@@ -170,7 +170,7 @@
.find { it.valueParameters.firstOrNull()?.type?.isFunctionType == false }
.let { symbolTable.descriptorExtension.referenceSimpleFunction(it!!) }
- override val symbols = JsSymbols(this@JsIrBackendContext)
+ override val symbols = JsSymbols(irBuiltIns, irFactory.stageController, intrinsics)
override val ir = object : Ir<JsIrBackendContext>(this) {
override val symbols = this@JsIrBackendContext.symbols
override fun shouldGenerateHandlerParameterForDefaultBodyFun() = true
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsSymbols.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsSymbols.kt
index 2c51eb7..a37dff93 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsSymbols.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsSymbols.kt
@@ -9,6 +9,7 @@
import org.jetbrains.kotlin.builtins.StandardNames.COLLECTIONS_PACKAGE_FQ_NAME
import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
+import org.jetbrains.kotlin.ir.declarations.StageController
import org.jetbrains.kotlin.ir.expressions.IrCall
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
@@ -29,8 +30,10 @@
@OptIn(ObsoleteDescriptorBasedAPI::class)
class JsSymbols(
- private val context: JsIrBackendContext,
-) : JsCommonSymbols(context.irBuiltIns) {
+ irBuiltIns: IrBuiltIns,
+ private val stageController: StageController,
+ private val intrinsics: JsIntrinsics,
+) : JsCommonSymbols(irBuiltIns) {
override val throwNullPointerException =
irBuiltIns.topLevelFunction(kotlinPackageFqn, "THROW_NPE")
@@ -86,11 +89,11 @@
override val functionAdapter = irBuiltIns.topLevelClass(BASE_JS_PACKAGE, "FunctionAdapter")
override fun functionN(n: Int): IrClassSymbol {
- return context.irFactory.stageController.withInitialIr { super.functionN(n) }
+ return stageController.withInitialIr { super.functionN(n) }
}
override fun suspendFunctionN(n: Int): IrClassSymbol {
- return context.irFactory.stageController.withInitialIr { super.suspendFunctionN(n) }
+ return stageController.withInitialIr { super.suspendFunctionN(n) }
}
@@ -124,11 +127,11 @@
}
override fun isSideEffectFree(call: IrCall): Boolean =
- call.symbol in context.intrinsics.primitiveToLiteralConstructor.values ||
- call.symbol == context.intrinsics.arrayLiteral ||
- call.symbol == context.intrinsics.arrayConcat ||
- call.symbol == context.intrinsics.jsBoxIntrinsic ||
- call.symbol == context.intrinsics.jsUnboxIntrinsic
+ call.symbol in intrinsics.primitiveToLiteralConstructor.values ||
+ call.symbol == intrinsics.arrayLiteral ||
+ call.symbol == intrinsics.arrayConcat ||
+ call.symbol == intrinsics.jsBoxIntrinsic ||
+ call.symbol == intrinsics.jsUnboxIntrinsic
companion object {
// TODO: due to name clash those weird suffix is required, remove it once `MemberNameGenerator` is implemented
diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmBackendContext.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmBackendContext.kt
index 1ee3a6b..9d0442f 100644
--- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmBackendContext.kt
+++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmBackendContext.kt
@@ -78,7 +78,7 @@
override val testFunsPerFile = hashMapOf<IrFile, IrSimpleFunction>()
override val jsPromiseSymbol: IrClassSymbol?
- get() = if (isWasmJsTarget) wasmSymbols.jsRelatedSymbols.jsPromise else null
+ get() = if (configuration.wasmTarget == WasmTarget.JS) wasmSymbols.jsRelatedSymbols.jsPromise else null
override val innerClassesSupport: InnerClassesSupport = JsInnerClassesSupport(mapping, irFactory)
@@ -86,7 +86,7 @@
val kotlinWasmInternalPackageFqn = internalPackageFqn.child(Name.identifier("internal"))
- val wasmSymbols: WasmSymbols = WasmSymbols(this@WasmBackendContext)
+ val wasmSymbols: WasmSymbols = WasmSymbols(irBuiltIns, configuration)
override val symbols = wasmSymbols
override val reflectionSymbols: ReflectionSymbols get() = wasmSymbols.reflectionSymbols
diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmSymbols.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmSymbols.kt
index 217657e..f58d14e 100644
--- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmSymbols.kt
+++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmSymbols.kt
@@ -7,8 +7,10 @@
import org.jetbrains.kotlin.builtins.StandardNames
import org.jetbrains.kotlin.builtins.isFunctionType
+import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
+import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.backend.js.JsCommonSymbols
import org.jetbrains.kotlin.ir.backend.js.ReflectionSymbols
@@ -24,11 +26,13 @@
import org.jetbrains.kotlin.platform.wasm.WasmTarget
import org.jetbrains.kotlin.resolve.scopes.MemberScope
import org.jetbrains.kotlin.wasm.config.WasmConfigurationKeys
+import org.jetbrains.kotlin.wasm.config.wasmTarget
@OptIn(ObsoleteDescriptorBasedAPI::class)
class WasmSymbols(
- private val context: WasmBackendContext,
-) : JsCommonSymbols(context.irBuiltIns) {
+ irBuiltIns: IrBuiltIns,
+ configuration: CompilerConfiguration,
+) : JsCommonSymbols(irBuiltIns) {
private val enumsInternalPackageFqName = FqName("kotlin.enums")
private val wasmInternalFqName = FqName("kotlin.wasm.internal")
@@ -124,14 +128,14 @@
private val consumeAnyIntoVoid = getInternalFunction("consumeAnyIntoVoid")
private val consumePrimitiveIntoVoid = mapOf(
- context.irBuiltIns.booleanType to getInternalFunction("consumeBooleanIntoVoid"),
- context.irBuiltIns.byteType to getInternalFunction("consumeByteIntoVoid"),
- context.irBuiltIns.shortType to getInternalFunction("consumeShortIntoVoid"),
- context.irBuiltIns.charType to getInternalFunction("consumeCharIntoVoid"),
- context.irBuiltIns.intType to getInternalFunction("consumeIntIntoVoid"),
- context.irBuiltIns.longType to getInternalFunction("consumeLongIntoVoid"),
- context.irBuiltIns.floatType to getInternalFunction("consumeFloatIntoVoid"),
- context.irBuiltIns.doubleType to getInternalFunction("consumeDoubleIntoVoid")
+ irBuiltIns.booleanType to getInternalFunction("consumeBooleanIntoVoid"),
+ irBuiltIns.byteType to getInternalFunction("consumeByteIntoVoid"),
+ irBuiltIns.shortType to getInternalFunction("consumeShortIntoVoid"),
+ irBuiltIns.charType to getInternalFunction("consumeCharIntoVoid"),
+ irBuiltIns.intType to getInternalFunction("consumeIntIntoVoid"),
+ irBuiltIns.longType to getInternalFunction("consumeLongIntoVoid"),
+ irBuiltIns.floatType to getInternalFunction("consumeFloatIntoVoid"),
+ irBuiltIns.doubleType to getInternalFunction("consumeDoubleIntoVoid")
)
fun findVoidConsumer(type: IrType): IrSimpleFunctionSymbol =
@@ -140,14 +144,14 @@
private val closureBoxAnyClass = getInternalClass("ClosureBoxAny")
private val closureBoxClasses = mapOf(
- context.irBuiltIns.booleanType to getInternalClass("ClosureBoxBoolean"),
- context.irBuiltIns.byteType to getInternalClass("ClosureBoxByte"),
- context.irBuiltIns.shortType to getInternalClass("ClosureBoxShort"),
- context.irBuiltIns.charType to getInternalClass("ClosureBoxChar"),
- context.irBuiltIns.intType to getInternalClass("ClosureBoxInt"),
- context.irBuiltIns.longType to getInternalClass("ClosureBoxLong"),
- context.irBuiltIns.floatType to getInternalClass("ClosureBoxFloat"),
- context.irBuiltIns.doubleType to getInternalClass("ClosureBoxDouble")
+ irBuiltIns.booleanType to getInternalClass("ClosureBoxBoolean"),
+ irBuiltIns.byteType to getInternalClass("ClosureBoxByte"),
+ irBuiltIns.shortType to getInternalClass("ClosureBoxShort"),
+ irBuiltIns.charType to getInternalClass("ClosureBoxChar"),
+ irBuiltIns.intType to getInternalClass("ClosureBoxInt"),
+ irBuiltIns.longType to getInternalClass("ClosureBoxLong"),
+ irBuiltIns.floatType to getInternalClass("ClosureBoxFloat"),
+ irBuiltIns.doubleType to getInternalClass("ClosureBoxDouble")
)
fun findClosureBoxClass(type: IrType): IrClassSymbol =
@@ -155,24 +159,24 @@
val equalityFunctions =
mapOf(
- context.irBuiltIns.booleanType to getInternalFunction("wasm_i32_eq"),
- context.irBuiltIns.byteType to getInternalFunction("wasm_i32_eq"),
- context.irBuiltIns.shortType to getInternalFunction("wasm_i32_eq"),
+ irBuiltIns.booleanType to getInternalFunction("wasm_i32_eq"),
+ irBuiltIns.byteType to getInternalFunction("wasm_i32_eq"),
+ irBuiltIns.shortType to getInternalFunction("wasm_i32_eq"),
uByteType to getInternalFunction("wasm_i32_eq"),
uShortType to getInternalFunction("wasm_i32_eq"),
- context.irBuiltIns.charType to getInternalFunction("wasm_i32_eq"),
- context.irBuiltIns.intType to getInternalFunction("wasm_i32_eq"),
+ irBuiltIns.charType to getInternalFunction("wasm_i32_eq"),
+ irBuiltIns.intType to getInternalFunction("wasm_i32_eq"),
uIntType to getInternalFunction("wasm_i32_eq"),
- context.irBuiltIns.longType to getInternalFunction("wasm_i64_eq"),
+ irBuiltIns.longType to getInternalFunction("wasm_i64_eq"),
uLongType to getInternalFunction("wasm_i64_eq")
)
val floatEqualityFunctions = mapOf(
- context.irBuiltIns.floatType to getInternalFunction("wasm_f32_eq"),
- context.irBuiltIns.doubleType to getInternalFunction("wasm_f64_eq")
+ irBuiltIns.floatType to getInternalFunction("wasm_f32_eq"),
+ irBuiltIns.doubleType to getInternalFunction("wasm_f64_eq")
)
- private fun wasmPrimitiveTypeName(classifier: IrClassifierSymbol): String = with(context.irBuiltIns) {
+ private fun wasmPrimitiveTypeName(classifier: IrClassifierSymbol): String = with(irBuiltIns) {
when (classifier) {
booleanClass, byteClass, shortClass, charClass, intClass -> "i32"
floatClass -> "f32"
@@ -182,7 +186,7 @@
}
}
- val comparisonBuiltInsToWasmIntrinsics = context.irBuiltIns.run {
+ val comparisonBuiltInsToWasmIntrinsics = irBuiltIns.run {
listOf(
lessFunByOperandType to "lt",
lessOrEqualFunByOperandType to "le",
@@ -383,13 +387,13 @@
private val wasmExportClass = getIrClass(FqName("kotlin.wasm.WasmExport"))
val wasmExportConstructor by lazy { wasmExportClass.constructors.single() }
- private val jsRelatedSymbolsIfNonWasi = if (context.isWasmJsTarget) JsRelatedSymbols() else null
+ private val jsRelatedSymbolsIfNonWasi = if (configuration.wasmTarget == WasmTarget.JS) JsRelatedSymbols() else null
val jsRelatedSymbols get() = jsRelatedSymbolsIfNonWasi ?: error("Cannot access to js related std in wasi mode")
private val invokeOnExportedFunctionExitIfWasi =
- when (context.configuration.get(WasmConfigurationKeys.WASM_TARGET, WasmTarget.JS) == WasmTarget.WASI) {
+ when (configuration.wasmTarget == WasmTarget.WASI) {
true -> getInternalFunction("invokeOnExportedFunctionExit")
else -> null
}