diff --git a/core/src/main/java/org/teavm/backend/wasm/WasmTarget.java b/core/src/main/java/org/teavm/backend/wasm/WasmTarget.java index 149e7316c..b252c996d 100644 --- a/core/src/main/java/org/teavm/backend/wasm/WasmTarget.java +++ b/core/src/main/java/org/teavm/backend/wasm/WasmTarget.java @@ -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); diff --git a/core/src/main/java/org/teavm/backend/wasm/generate/WasmGenerationVisitor.java b/core/src/main/java/org/teavm/backend/wasm/generate/WasmGenerationVisitor.java index 81b74d0a2..94b3ab7cd 100644 --- a/core/src/main/java/org/teavm/backend/wasm/generate/WasmGenerationVisitor.java +++ b/core/src/main/java/org/teavm/backend/wasm/generate/WasmGenerationVisitor.java @@ -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); } diff --git a/core/src/main/java/org/teavm/backend/wasm/generate/WasmGenerator.java b/core/src/main/java/org/teavm/backend/wasm/generate/WasmGenerator.java index 33854cb13..d2062906d 100644 --- a/core/src/main/java/org/teavm/backend/wasm/generate/WasmGenerator.java +++ b/core/src/main/java/org/teavm/backend/wasm/generate/WasmGenerator.java @@ -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()); diff --git a/core/src/main/java/org/teavm/backend/wasm/render/WasmBinaryRenderer.java b/core/src/main/java/org/teavm/backend/wasm/render/WasmBinaryRenderer.java index 328e55bc5..41684c01f 100644 --- a/core/src/main/java/org/teavm/backend/wasm/render/WasmBinaryRenderer.java +++ b/core/src/main/java/org/teavm/backend/wasm/render/WasmBinaryRenderer.java @@ -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 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()) { diff --git a/core/src/main/java/org/teavm/backend/wasm/render/WasmBinaryRenderingVisitor.java b/core/src/main/java/org/teavm/backend/wasm/render/WasmBinaryRenderingVisitor.java index f9c0105a5..98a240c6f 100644 --- a/core/src/main/java/org/teavm/backend/wasm/render/WasmBinaryRenderingVisitor.java +++ b/core/src/main/java/org/teavm/backend/wasm/render/WasmBinaryRenderingVisitor.java @@ -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());