mirror of
https://github.com/konsoletyper/teavm.git
synced 2024-11-27 01:30:35 +08:00
WASM: implementing support of 0xC version
This commit is contained in:
parent
b4916ee4e7
commit
56b1f54dda
@ -528,14 +528,12 @@ public class WasmTarget implements TeaVMTarget {
|
||||
WasmExpression lowerCondition = new WasmIntBinary(WasmIntType.INT32, WasmIntBinaryOperation.LT_SIGNED,
|
||||
new WasmGetLocal(subtypeVar), new WasmInt32Constant(lower));
|
||||
WasmConditional testLower = new WasmConditional(lowerCondition);
|
||||
testLower.setType(WasmType.INT32);
|
||||
testLower.getThenBlock().getBody().add(new WasmReturn(new WasmInt32Constant(0)));
|
||||
body.add(testLower);
|
||||
|
||||
WasmExpression upperCondition = new WasmIntBinary(WasmIntType.INT32, WasmIntBinaryOperation.GT_SIGNED,
|
||||
new WasmGetLocal(subtypeVar), new WasmInt32Constant(upper));
|
||||
WasmConditional testUpper = new WasmConditional(upperCondition);
|
||||
testLower.setType(WasmType.INT32);
|
||||
testUpper.getThenBlock().getBody().add(new WasmReturn(new WasmInt32Constant(0)));
|
||||
body.add(testUpper);
|
||||
|
||||
|
@ -340,7 +340,7 @@ class WasmGenerationVisitor implements StatementVisitor, ExprVisitor {
|
||||
branch.setResult(new WasmInt32Constant(0));
|
||||
branch.setLocation(expr.getLocation());
|
||||
branch.getResult().setLocation(expr.getLocation());
|
||||
block.getBody().add(branch);
|
||||
block.getBody().add(new WasmDrop(branch));
|
||||
|
||||
accept(expr.getSecondOperand());
|
||||
block.getBody().add(result);
|
||||
@ -359,7 +359,7 @@ class WasmGenerationVisitor implements StatementVisitor, ExprVisitor {
|
||||
branch.setResult(new WasmInt32Constant(1));
|
||||
branch.setLocation(expr.getLocation());
|
||||
branch.getResult().setLocation(expr.getLocation());
|
||||
block.getBody().add(branch);
|
||||
block.getBody().add(new WasmDrop(branch));
|
||||
|
||||
accept(expr.getSecondOperand());
|
||||
block.getBody().add(result);
|
||||
@ -1213,13 +1213,13 @@ class WasmGenerationVisitor implements StatementVisitor, ExprVisitor {
|
||||
new WasmGetLocal(tagVar), new WasmInt32Constant(ranges.get(0).lower));
|
||||
WasmBranch lowerThanMin = new WasmBranch(lowerThanMinCond, block);
|
||||
lowerThanMin.setResult(new WasmInt32Constant(0));
|
||||
block.getBody().add(lowerThanMin);
|
||||
block.getBody().add(new WasmDrop(lowerThanMin));
|
||||
|
||||
WasmExpression upperThanMaxCond = new WasmIntBinary(WasmIntType.INT32, WasmIntBinaryOperation.GT_SIGNED,
|
||||
new WasmGetLocal(tagVar), new WasmInt32Constant(ranges.get(ranges.size() - 1).upper));
|
||||
WasmBranch upperThanMax = new WasmBranch(upperThanMaxCond, block);
|
||||
upperThanMax.setResult(new WasmInt32Constant(0));
|
||||
block.getBody().add(upperThanMax);
|
||||
block.getBody().add(new WasmDrop(upperThanMax));
|
||||
|
||||
for (int i = 1; i < ranges.size(); ++i) {
|
||||
WasmExpression upperThanExcluded = new WasmIntBinary(WasmIntType.INT32,
|
||||
@ -1233,7 +1233,7 @@ class WasmGenerationVisitor implements StatementVisitor, ExprVisitor {
|
||||
|
||||
WasmBranch branch = new WasmBranch(lowerThanExcluded, block);
|
||||
branch.setResult(new WasmInt32Constant(0));
|
||||
conditional.getThenBlock().getBody().add(branch);
|
||||
conditional.getThenBlock().getBody().add(new WasmDrop(branch));
|
||||
|
||||
block.getBody().add(conditional);
|
||||
}
|
||||
|
@ -22,6 +22,11 @@ import org.teavm.backend.wasm.binary.BinaryWriter;
|
||||
import org.teavm.backend.wasm.model.WasmFunction;
|
||||
import org.teavm.backend.wasm.model.WasmLocal;
|
||||
import org.teavm.backend.wasm.model.WasmType;
|
||||
import org.teavm.backend.wasm.model.expression.WasmExpression;
|
||||
import org.teavm.backend.wasm.model.expression.WasmFloat32Constant;
|
||||
import org.teavm.backend.wasm.model.expression.WasmFloat64Constant;
|
||||
import org.teavm.backend.wasm.model.expression.WasmInt32Constant;
|
||||
import org.teavm.backend.wasm.model.expression.WasmInt64Constant;
|
||||
import org.teavm.interop.Export;
|
||||
import org.teavm.model.AnnotationReader;
|
||||
import org.teavm.model.ClassHolder;
|
||||
@ -85,6 +90,27 @@ public class WasmGenerator {
|
||||
methodAst.getBody().acceptVisitor(visitor);
|
||||
function.getBody().add(visitor.result);
|
||||
|
||||
if (function.getResult() != null) {
|
||||
WasmExpression finalExpr;
|
||||
switch (function.getResult()) {
|
||||
case INT32:
|
||||
finalExpr = new WasmInt32Constant(0);
|
||||
break;
|
||||
case INT64:
|
||||
finalExpr = new WasmInt64Constant(0);
|
||||
break;
|
||||
case FLOAT32:
|
||||
finalExpr = new WasmFloat32Constant(0);
|
||||
break;
|
||||
case FLOAT64:
|
||||
finalExpr = new WasmFloat64Constant(0);
|
||||
break;
|
||||
default:
|
||||
throw new AssertionError();
|
||||
}
|
||||
function.getBody().add(finalExpr);
|
||||
}
|
||||
|
||||
AnnotationReader exportAnnot = method.getAnnotations().get(Export.class.getName());
|
||||
if (exportAnnot != null) {
|
||||
function.setExportName(exportAnnot.getValue("name").getString());
|
||||
|
@ -114,12 +114,12 @@ public class WasmBinaryRenderer {
|
||||
if (function.getImportName() == null) {
|
||||
continue;
|
||||
}
|
||||
functions.add(function);
|
||||
if (version == WasmBinaryVersion.V_0xB) {
|
||||
importIndexes.put(function.getName(), index++);
|
||||
} else {
|
||||
functionIndexes.put(function.getName(), functions.size());
|
||||
}
|
||||
functions.add(function);
|
||||
}
|
||||
if (functions.isEmpty()) {
|
||||
return;
|
||||
@ -186,7 +186,8 @@ public class WasmBinaryRenderer {
|
||||
} else {
|
||||
section.writeByte(1);
|
||||
section.writeByte(0x20);
|
||||
section.writeByte(0);
|
||||
section.writeByte(3);
|
||||
section.writeLEB(functionIndexes.size());
|
||||
section.writeLEB(functionIndexes.size());
|
||||
}
|
||||
writeSection(SECTION_TABLE, "table", section.getData());
|
||||
@ -313,6 +314,10 @@ public class WasmBinaryRenderer {
|
||||
}
|
||||
}
|
||||
|
||||
Map<String, Integer> importIndexes = this.importIndexes;
|
||||
if (version == WasmBinaryVersion.V_0xC) {
|
||||
importIndexes = this.functionIndexes;
|
||||
}
|
||||
WasmBinaryRenderingVisitor visitor = new WasmBinaryRenderingVisitor(code, version, functionIndexes,
|
||||
importIndexes, signatureIndexes);
|
||||
for (WasmExpression part : function.getBody()) {
|
||||
|
@ -645,7 +645,7 @@ class WasmBinaryRenderingVisitor implements WasmExpressionVisitor {
|
||||
for (WasmExpression argument : expression.getArguments()) {
|
||||
argument.acceptVisitor(this);
|
||||
}
|
||||
Integer functionIndex = !expression.isImported() || version == WasmBinaryVersion.V_0xC
|
||||
Integer functionIndex = !expression.isImported()
|
||||
? functionIndexes.get(expression.getFunctionName())
|
||||
: importedIndexes.get(expression.getFunctionName());
|
||||
if (functionIndex == null) {
|
||||
@ -664,10 +664,15 @@ class WasmBinaryRenderingVisitor implements WasmExpressionVisitor {
|
||||
|
||||
@Override
|
||||
public void visit(WasmIndirectCall expression) {
|
||||
expression.getSelector().acceptVisitor(this);
|
||||
if (version == WasmBinaryVersion.V_0xB) {
|
||||
expression.getSelector().acceptVisitor(this);
|
||||
}
|
||||
for (WasmExpression argument : expression.getArguments()) {
|
||||
argument.acceptVisitor(this);
|
||||
}
|
||||
if (version == WasmBinaryVersion.V_0xC) {
|
||||
expression.getSelector().acceptVisitor(this);
|
||||
}
|
||||
writer.writeByte(0x17);
|
||||
if (version == WasmBinaryVersion.V_0xB) {
|
||||
writer.writeLEB(expression.getArguments().size());
|
||||
|
Loading…
Reference in New Issue
Block a user