wasm gc: fix issues in Java 17 switch expression and metaprogramming API

This commit is contained in:
Alexey Andreev 2024-09-23 20:23:24 +02:00
parent f85aa977eb
commit f8022f9465
3 changed files with 39 additions and 12 deletions

View File

@ -134,7 +134,7 @@ public class WasmGCClassGenerator implements WasmGCClassInfoProvider, WasmGCInit
private int classNameOffset; private int classNameOffset;
private int classSimpleNameOffset; private int classSimpleNameOffset;
private int classCanonicalNameOffset; private int classCanonicalNameOffset;
private int classParentOffset; private int classParentOffset = -1;
private int classArrayOffset; private int classArrayOffset;
private int classArrayItemOffset; private int classArrayItemOffset;
private int classNewArrayOffset; private int classNewArrayOffset;
@ -1438,12 +1438,14 @@ public class WasmGCClassGenerator implements WasmGCClassInfoProvider, WasmGCInit
classTagOffset, classTagOffset,
new WasmInt32Constant(0) new WasmInt32Constant(0)
)); ));
function.getBody().add(new WasmStructSet( if (classParentOffset >= 0) {
standardClasses.classClass().getStructure(), function.getBody().add(new WasmStructSet(
new WasmGetLocal(targetVar), standardClasses.classClass().getStructure(),
classParentOffset, new WasmGetLocal(targetVar),
new WasmGetGlobal(standardClasses.objectClass().pointer) classParentOffset,
)); new WasmGetGlobal(standardClasses.objectClass().pointer)
));
}
return function; return function;
} }

View File

@ -480,9 +480,10 @@ public class WasmGCGenerationVisitor extends BaseWasmGenerationVisitor {
canInsertCast = false; canInsertCast = false;
} else if (!sourceStruct.isSupertypeOf(targetStruct)) { } else if (!sourceStruct.isSupertypeOf(targetStruct)) {
var block = new WasmBlock(false); var block = new WasmBlock(false);
block.setType(targetType);
block.setLocation(expr.getLocation()); block.setLocation(expr.getLocation());
block.getBody().add(result); block.getBody().add(new WasmDrop(result));
block.getBody().add(new WasmUnreachable()); block.getBody().add(new WasmNullConstant(targetType));
result = block; result = block;
return; return;
} }

View File

@ -878,7 +878,15 @@ public class CompositeMethodGenerator {
case "get": { case "get": {
Variable var = program.createVariable(); Variable var = program.createVariable();
GetFieldInstruction insn = new GetFieldInstruction(); GetFieldInstruction insn = new GetFieldInstruction();
insn.setInstance(!field.field.hasModifier(ElementModifier.STATIC) ? var(arguments.get(0)) : null); if (!field.field.hasModifier(ElementModifier.STATIC)) {
var cast = new CastInstruction();
cast.setReceiver(program.createVariable());
cast.setValue(var(arguments.get(0)));
cast.setWeak(true);
cast.setTargetType(ValueType.object(field.field.getOwnerName()));
add(cast);
insn.setInstance(cast.getReceiver());
}
insn.setReceiver(var); insn.setReceiver(var);
insn.setField(field.getBackingField().getReference()); insn.setField(field.getBackingField().getReference());
insn.setFieldType(field.getBackingField().getType()); insn.setFieldType(field.getBackingField().getType());
@ -895,7 +903,15 @@ public class CompositeMethodGenerator {
} }
case "set": { case "set": {
PutFieldInstruction insn = new PutFieldInstruction(); PutFieldInstruction insn = new PutFieldInstruction();
insn.setInstance(!field.field.hasModifier(ElementModifier.STATIC) ? var(arguments.get(0)) : null); if (!field.field.hasModifier(ElementModifier.STATIC)) {
var cast = new CastInstruction();
cast.setReceiver(program.createVariable());
cast.setValue(var(arguments.get(0)));
cast.setWeak(true);
cast.setTargetType(ValueType.object(field.field.getOwnerName()));
add(cast);
insn.setInstance(cast.getReceiver());
}
insn.setValue(unbox(var(arguments.get(1)), field.getBackingField().getType())); insn.setValue(unbox(var(arguments.get(1)), field.getBackingField().getType()));
insn.setField(field.getBackingField().getReference()); insn.setField(field.getBackingField().getReference());
insn.setFieldType(field.getBackingField().getType()); insn.setFieldType(field.getBackingField().getType());
@ -930,7 +946,15 @@ public class CompositeMethodGenerator {
switch (method.getName()) { switch (method.getName()) {
case "invoke": { case "invoke": {
InvokeInstruction insn = new InvokeInstruction(); InvokeInstruction insn = new InvokeInstruction();
insn.setInstance(!Modifier.isStatic(reflectMethod.getModifiers()) ? var(arguments.get(0)) : null); if (!Modifier.isStatic(reflectMethod.getModifiers())) {
var cast = new CastInstruction();
cast.setReceiver(program.createVariable());
cast.setValue(var(arguments.get(0)));
cast.setWeak(true);
cast.setTargetType(ValueType.object(reflectMethod.method.getOwnerName()));
add(cast);
insn.setInstance(cast.getReceiver());
}
insn.setType(Modifier.isStatic(reflectMethod.getModifiers()) ? InvocationType.SPECIAL insn.setType(Modifier.isStatic(reflectMethod.getModifiers()) ? InvocationType.SPECIAL
: InvocationType.VIRTUAL); : InvocationType.VIRTUAL);
insn.setMethod(reflectMethod.method.getReference()); insn.setMethod(reflectMethod.method.getReference());