From 37879e18d9d3dd5105da0920b1ec1b69f0ba057a Mon Sep 17 00:00:00 2001 From: Zalim Bashorov Date: Thu, 15 Dec 2022 20:58:08 +0100 Subject: [PATCH] [Wasm] Pass location instead of fileEntry to generateConstExpression --- .../backend/wasm/ir2wasm/BodyGenerator.kt | 2 +- .../wasm/ir2wasm/DeclarationGenerator.kt | 65 ++++++++++--------- 2 files changed, 37 insertions(+), 30 deletions(-) diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/BodyGenerator.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/BodyGenerator.kt index 84bb389a865..7f7e9f20914 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/BodyGenerator.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/BodyGenerator.kt @@ -178,7 +178,7 @@ class BodyGenerator( } override fun visitConst(expression: IrConst<*>): Unit = - generateConstExpression(expression, body, context, functionContext.irFunction.fileOrNull?.fileEntry) + generateConstExpression(expression, body, context, expression.getSourceLocation()) override fun visitGetField(expression: IrGetField) { val field: IrField = expression.symbol.owner diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/DeclarationGenerator.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/DeclarationGenerator.kt index 454c3da9e67..5083bf93596 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/DeclarationGenerator.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/DeclarationGenerator.kt @@ -12,7 +12,6 @@ import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.ir.IrBuiltIns import org.jetbrains.kotlin.ir.IrElement -import org.jetbrains.kotlin.ir.IrFileEntry import org.jetbrains.kotlin.ir.backend.js.utils.isJsExport import org.jetbrains.kotlin.ir.backend.js.utils.findUnitGetInstanceFunction import org.jetbrains.kotlin.ir.backend.js.utils.getJsNameOrKotlinName @@ -458,7 +457,12 @@ class DeclarationGenerator( check(initValue is IrConst<*> && initValue.kind !is IrConstKind.String) { "Static field initializer should be string or const" } - generateConstExpression(initValue, wasmExpressionGenerator, context, declaration.fileOrNull?.fileEntry) + generateConstExpression( + initValue, + wasmExpressionGenerator, + context, + declaration.getSourceLocation(declaration.fileOrNull?.fileEntry) + ) } else { generateDefaultInitializerForType(wasmType, wasmExpressionGenerator) } @@ -500,31 +504,34 @@ fun IrFunction.isExported(): Boolean = isJsExport() -fun generateConstExpression(expression: IrConst<*>, body: WasmExpressionBuilder, context: WasmModuleCodegenContext, fileEntry: IrFileEntry?) = - expression.getSourceLocation(fileEntry).let { location -> - when (val kind = expression.kind) { - is IrConstKind.Null -> { - val bottomType = if (expression.type.getClass()?.isExternal == true) WasmRefNullExternrefType else WasmRefNullNoneType - body.buildInstr(WasmOp.REF_NULL, location, WasmImmediate.HeapType(bottomType)) - } - is IrConstKind.Boolean -> body.buildConstI32(if (kind.valueOf(expression)) 1 else 0, location) - is IrConstKind.Byte -> body.buildConstI32(kind.valueOf(expression).toInt(), location) - is IrConstKind.Short -> body.buildConstI32(kind.valueOf(expression).toInt(), location) - is IrConstKind.Int -> body.buildConstI32(kind.valueOf(expression), location) - is IrConstKind.Long -> body.buildConstI64(kind.valueOf(expression), location) - is IrConstKind.Char -> body.buildConstI32(kind.valueOf(expression).code, location) - is IrConstKind.Float -> body.buildConstF32(kind.valueOf(expression), location) - is IrConstKind.Double -> body.buildConstF64(kind.valueOf(expression), location) - is IrConstKind.String -> { - val stringValue = kind.valueOf(expression) - val (literalAddress, literalPoolId) = context.referenceStringLiteralAddressAndId(stringValue) - body.commentGroupStart { "const string: \"$stringValue\"" } - body.buildConstI32Symbol(literalPoolId, location) - body.buildConstI32Symbol(literalAddress, location) - body.buildConstI32(stringValue.length, location) - body.buildCall(context.referenceFunction(context.backendContext.wasmSymbols.stringGetLiteral), location) - body.commentGroupEnd() - } - else -> error("Unknown constant kind") +fun generateConstExpression( + expression: IrConst<*>, + body: WasmExpressionBuilder, + context: WasmModuleCodegenContext, + location: SourceLocation +) = + when (val kind = expression.kind) { + is IrConstKind.Null -> { + val bottomType = if (expression.type.getClass()?.isExternal == true) WasmRefNullExternrefType else WasmRefNullNoneType + body.buildInstr(WasmOp.REF_NULL, location, WasmImmediate.HeapType(bottomType)) } - } \ No newline at end of file + is IrConstKind.Boolean -> body.buildConstI32(if (kind.valueOf(expression)) 1 else 0, location) + is IrConstKind.Byte -> body.buildConstI32(kind.valueOf(expression).toInt(), location) + is IrConstKind.Short -> body.buildConstI32(kind.valueOf(expression).toInt(), location) + is IrConstKind.Int -> body.buildConstI32(kind.valueOf(expression), location) + is IrConstKind.Long -> body.buildConstI64(kind.valueOf(expression), location) + is IrConstKind.Char -> body.buildConstI32(kind.valueOf(expression).code, location) + is IrConstKind.Float -> body.buildConstF32(kind.valueOf(expression), location) + is IrConstKind.Double -> body.buildConstF64(kind.valueOf(expression), location) + is IrConstKind.String -> { + val stringValue = kind.valueOf(expression) + val (literalAddress, literalPoolId) = context.referenceStringLiteralAddressAndId(stringValue) + body.commentGroupStart { "const string: \"$stringValue\"" } + body.buildConstI32Symbol(literalPoolId, location) + body.buildConstI32Symbol(literalAddress, location) + body.buildConstI32(stringValue.length, location) + body.buildCall(context.referenceFunction(context.backendContext.wasmSymbols.stringGetLiteral), location) + body.commentGroupEnd() + } + else -> error("Unknown constant kind") + }