[Wasm] Require location for buildStructNew and fix all usages

This commit is contained in:
Zalim Bashorov
2022-12-13 19:13:27 +01:00
parent 3967bd2755
commit 530438dfcb
3 changed files with 16 additions and 12 deletions
@@ -134,9 +134,10 @@ class BodyGenerator(
check(wasmArrayType != null) check(wasmArrayType != null)
generateAnyParameters(arrayClass.symbol, expression.getSourceLocation()) val location = expression.getSourceLocation()
generateAnyParameters(arrayClass.symbol, location)
if (!tryGenerateConstVarargArray(expression, wasmArrayType)) tryGenerateVarargArray(expression, wasmArrayType) if (!tryGenerateConstVarargArray(expression, wasmArrayType)) tryGenerateVarargArray(expression, wasmArrayType)
body.buildStructNew(context.referenceGcType(expression.type.getRuntimeClass(irBuiltIns).symbol)) body.buildStructNew(context.referenceGcType(expression.type.getRuntimeClass(irBuiltIns).symbol), location)
} }
override fun visitThrow(expression: IrThrow) { override fun visitThrow(expression: IrThrow) {
@@ -284,11 +285,12 @@ class BodyGenerator(
} }
if (expression.symbol.owner.hasWasmPrimitiveConstructorAnnotation()) { if (expression.symbol.owner.hasWasmPrimitiveConstructorAnnotation()) {
generateAnyParameters(klassSymbol, expression.getSourceLocation()) val location = expression.getSourceLocation()
generateAnyParameters(klassSymbol, location)
for (i in 0 until expression.valueArgumentsCount) { for (i in 0 until expression.valueArgumentsCount) {
generateExpression(expression.getValueArgument(i)!!) generateExpression(expression.getValueArgument(i)!!)
} }
body.buildStructNew(wasmGcType) body.buildStructNew(wasmGcType, location)
body.commentPreviousInstr { "@WasmPrimitiveConstructor ctor call: ${klass.fqNameWhenAvailable}" } body.commentPreviousInstr { "@WasmPrimitiveConstructor ctor call: ${klass.fqNameWhenAvailable}" }
return return
} }
@@ -329,7 +331,7 @@ class BodyGenerator(
generateDefaultInitializerForType(context.transformType(field.type), body) generateDefaultInitializerForType(context.transformType(field.type), body)
} }
} }
body.buildStructNew(context.referenceGcType(parentClass.symbol)) body.buildStructNew(context.referenceGcType(parentClass.symbol), location)
body.buildSetLocal(thisParameter, location) body.buildSetLocal(thisParameter, location)
body.buildEnd() body.buildEnd()
} }
@@ -351,9 +353,10 @@ class BodyGenerator(
private fun generateBox(expression: IrExpression, type: IrType) { private fun generateBox(expression: IrExpression, type: IrType) {
val klassSymbol = type.getRuntimeClass(irBuiltIns).symbol val klassSymbol = type.getRuntimeClass(irBuiltIns).symbol
generateAnyParameters(klassSymbol, expression.getSourceLocation()) val location = expression.getSourceLocation()
generateAnyParameters(klassSymbol, location)
generateExpression(expression) generateExpression(expression)
body.buildStructNew(context.referenceGcType(klassSymbol)) body.buildStructNew(context.referenceGcType(klassSymbol), location)
body.commentPreviousInstr { "box" } body.commentPreviousInstr { "box" }
} }
@@ -269,7 +269,7 @@ class DeclarationGenerator(
buildRefNull(vtableStruct.fields[i].type.getHeapType()) buildRefNull(vtableStruct.fields[i].type.getHeapType())
} }
} }
buildStructNew(vTableTypeReference) buildStructNew(vTableTypeReference, SourceLocation.NoLocation("Create instance of vtable struct"))
} }
context.defineGlobalVTable( context.defineGlobalVTable(
irClass = symbol, irClass = symbol,
@@ -278,6 +278,7 @@ class DeclarationGenerator(
} }
private fun createClassITable(metadata: ClassMetadata) { private fun createClassITable(metadata: ClassMetadata) {
val location = SourceLocation.NoLocation("Create instance of itable struct")
val klass = metadata.klass val klass = metadata.klass
if (klass.isAbstractOrSealed) return if (klass.isAbstractOrSealed) return
val supportedInterface = metadata.interfaces.firstOrNull()?.symbol ?: return val supportedInterface = metadata.interfaces.firstOrNull()?.symbol ?: return
@@ -313,9 +314,9 @@ class DeclarationGenerator(
buildRefNull(WasmHeapType.Type(context.referenceFunctionType(method.function.symbol))) buildRefNull(WasmHeapType.Type(context.referenceFunctionType(method.function.symbol)))
} }
} }
buildStructNew(iFaceVTableGcType) buildStructNew(iFaceVTableGcType, location)
} }
buildStructNew(classInterfaceType) buildStructNew(classInterfaceType, location)
} }
val wasmClassIFaceGlobal = WasmGlobal( val wasmClassIFaceGlobal = WasmGlobal(
@@ -153,8 +153,8 @@ abstract class WasmExpressionBuilder {
) )
} }
fun buildStructNew(struct: WasmSymbol<WasmTypeDeclaration>) { fun buildStructNew(struct: WasmSymbol<WasmTypeDeclaration>, location: SourceLocation) {
buildInstr(WasmOp.STRUCT_NEW, WasmImmediate.GcType(struct)) buildInstr(WasmOp.STRUCT_NEW, location, WasmImmediate.GcType(struct))
} }
fun buildStructSet(struct: WasmSymbol<WasmTypeDeclaration>, fieldId: WasmSymbol<Int>) { fun buildStructSet(struct: WasmSymbol<WasmTypeDeclaration>, fieldId: WasmSymbol<Int>) {