[Wasm] Pass location instead of fileEntry to generateConstExpression
This commit is contained in:
+1
-1
@@ -178,7 +178,7 @@ class BodyGenerator(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun visitConst(expression: IrConst<*>): Unit =
|
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) {
|
override fun visitGetField(expression: IrGetField) {
|
||||||
val field: IrField = expression.symbol.owner
|
val field: IrField = expression.symbol.owner
|
||||||
|
|||||||
+36
-29
@@ -12,7 +12,6 @@ import org.jetbrains.kotlin.config.languageVersionSettings
|
|||||||
import org.jetbrains.kotlin.descriptors.Modality
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
import org.jetbrains.kotlin.ir.IrBuiltIns
|
import org.jetbrains.kotlin.ir.IrBuiltIns
|
||||||
import org.jetbrains.kotlin.ir.IrElement
|
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.isJsExport
|
||||||
import org.jetbrains.kotlin.ir.backend.js.utils.findUnitGetInstanceFunction
|
import org.jetbrains.kotlin.ir.backend.js.utils.findUnitGetInstanceFunction
|
||||||
import org.jetbrains.kotlin.ir.backend.js.utils.getJsNameOrKotlinName
|
import org.jetbrains.kotlin.ir.backend.js.utils.getJsNameOrKotlinName
|
||||||
@@ -458,7 +457,12 @@ class DeclarationGenerator(
|
|||||||
check(initValue is IrConst<*> && initValue.kind !is IrConstKind.String) {
|
check(initValue is IrConst<*> && initValue.kind !is IrConstKind.String) {
|
||||||
"Static field initializer should be string or const"
|
"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 {
|
} else {
|
||||||
generateDefaultInitializerForType(wasmType, wasmExpressionGenerator)
|
generateDefaultInitializerForType(wasmType, wasmExpressionGenerator)
|
||||||
}
|
}
|
||||||
@@ -500,31 +504,34 @@ fun IrFunction.isExported(): Boolean =
|
|||||||
isJsExport()
|
isJsExport()
|
||||||
|
|
||||||
|
|
||||||
fun generateConstExpression(expression: IrConst<*>, body: WasmExpressionBuilder, context: WasmModuleCodegenContext, fileEntry: IrFileEntry?) =
|
fun generateConstExpression(
|
||||||
expression.getSourceLocation(fileEntry).let { location ->
|
expression: IrConst<*>,
|
||||||
when (val kind = expression.kind) {
|
body: WasmExpressionBuilder,
|
||||||
is IrConstKind.Null -> {
|
context: WasmModuleCodegenContext,
|
||||||
val bottomType = if (expression.type.getClass()?.isExternal == true) WasmRefNullExternrefType else WasmRefNullNoneType
|
location: SourceLocation
|
||||||
body.buildInstr(WasmOp.REF_NULL, location, WasmImmediate.HeapType(bottomType))
|
) =
|
||||||
}
|
when (val kind = expression.kind) {
|
||||||
is IrConstKind.Boolean -> body.buildConstI32(if (kind.valueOf(expression)) 1 else 0, location)
|
is IrConstKind.Null -> {
|
||||||
is IrConstKind.Byte -> body.buildConstI32(kind.valueOf(expression).toInt(), location)
|
val bottomType = if (expression.type.getClass()?.isExternal == true) WasmRefNullExternrefType else WasmRefNullNoneType
|
||||||
is IrConstKind.Short -> body.buildConstI32(kind.valueOf(expression).toInt(), location)
|
body.buildInstr(WasmOp.REF_NULL, location, WasmImmediate.HeapType(bottomType))
|
||||||
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")
|
|
||||||
}
|
}
|
||||||
}
|
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")
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user