[Wasm] Require location for buildRefNull and fix all usages

This commit is contained in:
Zalim Bashorov
2022-12-13 19:30:21 +01:00
parent 12854af0a2
commit 6eba0392db
3 changed files with 17 additions and 15 deletions
@@ -287,8 +287,9 @@ class BodyGenerator(
return
}
val location = expression.getSourceLocation()
if (expression.symbol.owner.hasWasmPrimitiveConstructorAnnotation()) {
val location = expression.getSourceLocation()
generateAnyParameters(klassSymbol, location)
for (i in 0 until expression.valueArgumentsCount) {
generateExpression(expression.getValueArgument(i)!!)
@@ -298,7 +299,7 @@ class BodyGenerator(
return
}
body.buildRefNull(WasmHeapType.Simple.NullNone) // this = null
body.buildRefNull(WasmHeapType.Simple.NullNone, location) // this = null
generateCall(expression)
}
@@ -309,7 +310,7 @@ class BodyGenerator(
if (klassSymbol.owner.hasInterfaceSuperClass()) {
body.buildGetGlobal(context.referenceGlobalClassITable(klassSymbol), location)
} else {
body.buildRefNull(WasmHeapType.Simple.Data)
body.buildRefNull(WasmHeapType.Simple.Data, location)
}
body.buildConstI32Symbol(context.referenceClassId(klassSymbol), location)
@@ -721,7 +722,7 @@ class BodyGenerator(
if (actualType.isNullableNothing() && expectedType.isNullable()) {
if (expectedType.getClass()?.isExternal == true) {
body.buildDrop()
body.buildRefNull(WasmHeapType.Simple.NullNoExtern)
body.buildRefNull(WasmHeapType.Simple.NullNoExtern, location)
}
return
}
@@ -258,6 +258,7 @@ class DeclarationGenerator(
val vTableRefGcType = WasmRefType(WasmHeapType.Type(vTableTypeReference))
val initVTableGlobal = buildWasmExpression {
val location = SourceLocation.NoLocation("Create instance of vtable struct")
metadata.virtualMethods.forEachIndexed { i, method ->
if (method.function.modality != Modality.ABSTRACT) {
buildInstr(WasmOp.REF_FUNC, WasmImmediate.FuncIdx(context.referenceFunction(method.function.symbol)))
@@ -266,10 +267,10 @@ class DeclarationGenerator(
"Cannot find class implementation of method ${method.signature} in class ${klass.fqNameWhenAvailable}"
}
//This erased by DCE so abstract version appeared in non-abstract class
buildRefNull(vtableStruct.fields[i].type.getHeapType())
buildRefNull(vtableStruct.fields[i].type.getHeapType(), location)
}
}
buildStructNew(vTableTypeReference, SourceLocation.NoLocation("Create instance of vtable struct"))
buildStructNew(vTableTypeReference, location)
}
context.defineGlobalVTable(
irClass = symbol,
@@ -294,7 +295,7 @@ class DeclarationGenerator(
val iFaceVTableGcNullHeapType = WasmHeapType.Type(iFaceVTableGcType)
if (!metadata.interfaces.contains(iFace.owner)) {
buildRefNull(iFaceVTableGcNullHeapType)
buildRefNull(iFaceVTableGcNullHeapType, location)
continue
}
@@ -311,7 +312,7 @@ class DeclarationGenerator(
buildInstr(WasmOp.REF_FUNC, WasmImmediate.FuncIdx(functionTypeReference))
} else {
//This erased by DCE so abstract version appeared in non-abstract class
buildRefNull(WasmHeapType.Type(context.referenceFunctionType(method.function.symbol)))
buildRefNull(WasmHeapType.Type(context.referenceFunctionType(method.function.symbol)), location)
}
}
buildStructNew(iFaceVTableGcType, location)
@@ -482,11 +483,11 @@ fun generateDefaultInitializerForType(type: WasmType, g: WasmExpressionBuilder)
WasmI64 -> g.buildConstI64(0, location)
WasmF32 -> g.buildConstF32(0f, location)
WasmF64 -> g.buildConstF64(0.0, location)
is WasmRefNullType -> g.buildRefNull(type.heapType)
is WasmRefNullNoneType -> g.buildRefNull(WasmHeapType.Simple.NullNone)
is WasmRefNullExternrefType -> g.buildRefNull(WasmHeapType.Simple.NullNoExtern)
is WasmAnyRef -> g.buildRefNull(WasmHeapType.Simple.Any)
is WasmExternRef -> g.buildRefNull(WasmHeapType.Simple.Extern)
is WasmRefNullType -> g.buildRefNull(type.heapType, location)
is WasmRefNullNoneType -> g.buildRefNull(WasmHeapType.Simple.NullNone, location)
is WasmRefNullExternrefType -> g.buildRefNull(WasmHeapType.Simple.NullNoExtern, location)
is WasmAnyRef -> g.buildRefNull(WasmHeapType.Simple.Any, location)
is WasmExternRef -> g.buildRefNull(WasmHeapType.Simple.Extern, location)
WasmUnreachableType -> error("Unreachable type can't be initialized")
else -> error("Unknown value type ${type.name}")
}
@@ -175,8 +175,8 @@ abstract class WasmExpressionBuilder {
buildInstr(WasmOp.REF_TEST_DEPRECATED, location, WasmImmediate.TypeIdx(toType))
}
fun buildRefNull(type: WasmHeapType) {
buildInstr(WasmOp.REF_NULL, WasmImmediate.HeapType(WasmRefType(type)))
fun buildRefNull(type: WasmHeapType, location: SourceLocation) {
buildInstr(WasmOp.REF_NULL, location, WasmImmediate.HeapType(WasmRefType(type)))
}
fun buildDrop() {