From 028ef9e1b1502b5380f6110f1870808262129623 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Mon, 26 Jun 2023 22:40:20 +0100 Subject: Generate WASM functions for Shed functions --- .../backends/wasm/WasmCodeGenCallTests.java | 8 ++- .../wasm/WasmCodeGenDefineFunctionTests.java | 58 ++++++++++++++++++++++ .../backends/wasm/WasmCodeGenDiscardTests.java | 5 +- .../backends/wasm/WasmCodeGenLocalLoadTests.java | 5 +- .../backends/wasm/WasmCodeGenLocalStoreTests.java | 5 +- .../backends/wasm/WasmCodeGenPushBoolTests.java | 8 ++- .../backends/wasm/WasmCodeGenPushIntTests.java | 5 +- .../backends/wasm/WasmCodeGenPushStringTests.java | 8 ++- .../backends/wasm/WasmCodeGenPushUnitTests.java | 5 +- .../backends/wasm/WasmCodeGenReturnTests.java | 5 +- .../compiler/backends/wasm/WasmCodeGenTesting.java | 15 ++++++ 11 files changed, 94 insertions(+), 33 deletions(-) create mode 100644 src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenDefineFunctionTests.java create mode 100644 src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenTesting.java (limited to 'src/test/java') diff --git a/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenCallTests.java b/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenCallTests.java index 5c89e0df..0048b22f 100644 --- a/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenCallTests.java +++ b/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenCallTests.java @@ -9,7 +9,7 @@ import org.shedlang.compiler.testing.snapshots.Snapshotter; import java.io.IOException; import java.util.List; -import static org.shedlang.compiler.backends.wasm.structure.WasmObjdump.objdump; +import static org.shedlang.compiler.backends.wasm.WasmCodeGenTesting.objdumpContext; @ExtendWith({SnapshotResolver.class}) public class WasmCodeGenCallTests { @@ -20,8 +20,7 @@ public class WasmCodeGenCallTests { var result = WasmCodeGen.generateInstruction(instruction, context); - var module = result.toFunction().toModule(); - snapshotter.assertSnapshot(objdump(module)); + snapshotter.assertSnapshot(objdumpContext(result)); } @Test @@ -31,7 +30,6 @@ public class WasmCodeGenCallTests { var result = WasmCodeGen.generateInstruction(instruction, context); - var module = result.toFunction().toModule(); - snapshotter.assertSnapshot(objdump(module)); + snapshotter.assertSnapshot(objdumpContext(result)); } } diff --git a/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenDefineFunctionTests.java b/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenDefineFunctionTests.java new file mode 100644 index 00000000..39d1c46e --- /dev/null +++ b/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenDefineFunctionTests.java @@ -0,0 +1,58 @@ +package org.shedlang.compiler.backends.wasm; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.shedlang.compiler.ast.typed.FreeVariables; +import org.shedlang.compiler.sources.Sources; +import org.shedlang.compiler.stackir.instructions.DefineFunctionInstruction; +import org.shedlang.compiler.stackir.instructions.Instructions; +import org.shedlang.compiler.testing.snapshots.SnapshotResolver; +import org.shedlang.compiler.testing.snapshots.Snapshotter; + +import java.io.IOException; +import java.util.List; + +import static org.shedlang.compiler.backends.wasm.WasmCodeGenTesting.objdumpContext; + +@ExtendWith({SnapshotResolver.class}) +public class WasmCodeGenDefineFunctionTests { + @Test + public void canDefineMinimalFunction(Snapshotter snapshotter) throws IOException, InterruptedException { + var instruction = new DefineFunctionInstruction( + "f", + List.of(), + List.of(), + FreeVariables.empty(), + List.of( + Instructions.pushUnit(), + Instructions.return_() + ), + Sources.NULL + ); + var context = WasmCodeGenContext.EMPTY; + + var result = WasmCodeGen.generateInstruction(instruction, context); + + snapshotter.assertSnapshot(objdumpContext(result)); + } + + @Test + public void freeVariablesAreStoredInAndLoadedFromEnvironment(Snapshotter snapshotter) throws IOException, InterruptedException { + var instruction = new DefineFunctionInstruction( + "f", + List.of(), + List.of(), + FreeVariables.of("a", "b"), + List.of( + Instructions.localLoad("a"), + Instructions.return_() + ), + Sources.NULL + ); + var context = WasmCodeGenContext.EMPTY; + + var result = WasmCodeGen.generateInstruction(instruction, context); + + snapshotter.assertSnapshot(objdumpContext(result)); + } +} diff --git a/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenDiscardTests.java b/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenDiscardTests.java index 2b1d84d3..7e42276e 100644 --- a/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenDiscardTests.java +++ b/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenDiscardTests.java @@ -8,7 +8,7 @@ import org.shedlang.compiler.testing.snapshots.Snapshotter; import java.io.IOException; -import static org.shedlang.compiler.backends.wasm.structure.WasmObjdump.objdump; +import static org.shedlang.compiler.backends.wasm.WasmCodeGenTesting.objdumpContext; @ExtendWith({SnapshotResolver.class}) public class WasmCodeGenDiscardTests { @@ -19,7 +19,6 @@ public class WasmCodeGenDiscardTests { var result = WasmCodeGen.generateInstruction(instruction, context); - var module = result.toFunction().toModule(); - snapshotter.assertSnapshot(objdump(module)); + snapshotter.assertSnapshot(objdumpContext(result)); } } diff --git a/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenLocalLoadTests.java b/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenLocalLoadTests.java index 3a07ffd8..62aefa1d 100644 --- a/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenLocalLoadTests.java +++ b/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenLocalLoadTests.java @@ -8,7 +8,7 @@ import org.shedlang.compiler.testing.snapshots.Snapshotter; import java.io.IOException; -import static org.shedlang.compiler.backends.wasm.structure.WasmObjdump.objdump; +import static org.shedlang.compiler.backends.wasm.WasmCodeGenTesting.objdumpContext; @ExtendWith({SnapshotResolver.class}) public class WasmCodeGenLocalLoadTests { @@ -25,7 +25,6 @@ public class WasmCodeGenLocalLoadTests { var result = WasmCodeGen.generateInstruction(instruction, context); - var module = result.toFunction().toModule(); - snapshotter.assertSnapshot(objdump(module)); + snapshotter.assertSnapshot(objdumpContext(result)); } } diff --git a/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenLocalStoreTests.java b/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenLocalStoreTests.java index ea82a5cb..35a7931e 100644 --- a/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenLocalStoreTests.java +++ b/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenLocalStoreTests.java @@ -8,7 +8,7 @@ import org.shedlang.compiler.testing.snapshots.Snapshotter; import java.io.IOException; -import static org.shedlang.compiler.backends.wasm.structure.WasmObjdump.objdump; +import static org.shedlang.compiler.backends.wasm.WasmCodeGenTesting.objdumpContext; @ExtendWith({SnapshotResolver.class}) public class WasmCodeGenLocalStoreTests { @@ -19,7 +19,6 @@ public class WasmCodeGenLocalStoreTests { var result = WasmCodeGen.generateInstruction(instruction, context); - var module = result.toFunction().toModule(); - snapshotter.assertSnapshot(objdump(module)); + snapshotter.assertSnapshot(objdumpContext(result)); } } diff --git a/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenPushBoolTests.java b/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenPushBoolTests.java index e7b2f57c..1b61badf 100644 --- a/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenPushBoolTests.java +++ b/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenPushBoolTests.java @@ -8,7 +8,7 @@ import org.shedlang.compiler.testing.snapshots.Snapshotter; import java.io.IOException; -import static org.shedlang.compiler.backends.wasm.structure.WasmObjdump.objdump; +import static org.shedlang.compiler.backends.wasm.WasmCodeGenTesting.objdumpContext; @ExtendWith({SnapshotResolver.class}) public class WasmCodeGenPushBoolTests { @@ -19,8 +19,7 @@ public class WasmCodeGenPushBoolTests { var result = WasmCodeGen.generateInstruction(instruction, context); - var module = result.toFunction().toModule(); - snapshotter.assertSnapshot(objdump(module)); + snapshotter.assertSnapshot(objdumpContext(result)); } @Test @@ -30,7 +29,6 @@ public class WasmCodeGenPushBoolTests { var result = WasmCodeGen.generateInstruction(instruction, context); - var module = result.toFunction().toModule(); - snapshotter.assertSnapshot(objdump(module)); + snapshotter.assertSnapshot(objdumpContext(result)); } } diff --git a/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenPushIntTests.java b/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenPushIntTests.java index e461f5f6..8b356372 100644 --- a/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenPushIntTests.java +++ b/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenPushIntTests.java @@ -8,7 +8,7 @@ import org.shedlang.compiler.testing.snapshots.Snapshotter; import java.io.IOException; -import static org.shedlang.compiler.backends.wasm.structure.WasmObjdump.objdump; +import static org.shedlang.compiler.backends.wasm.WasmCodeGenTesting.objdumpContext; @ExtendWith({SnapshotResolver.class}) public class WasmCodeGenPushIntTests { @@ -21,7 +21,6 @@ public class WasmCodeGenPushIntTests { var result = WasmCodeGen.generateInstruction(instruction, context); - var module = result.toFunction().toModule(); - snapshotter.assertSnapshot(objdump(module)); + snapshotter.assertSnapshot(objdumpContext(result)); } } diff --git a/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenPushStringTests.java b/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenPushStringTests.java index 79dd78d1..34d69178 100644 --- a/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenPushStringTests.java +++ b/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenPushStringTests.java @@ -8,7 +8,7 @@ import org.shedlang.compiler.testing.snapshots.Snapshotter; import java.io.IOException; -import static org.shedlang.compiler.backends.wasm.structure.WasmObjdump.objdump; +import static org.shedlang.compiler.backends.wasm.WasmCodeGenTesting.objdumpContext; @ExtendWith({SnapshotResolver.class}) public class WasmCodeGenPushStringTests { @@ -19,8 +19,7 @@ public class WasmCodeGenPushStringTests { var result = WasmCodeGen.generateInstruction(instruction, context); - var module = result.toFunction().toModule(); - snapshotter.assertSnapshot(objdump(module)); + snapshotter.assertSnapshot(objdumpContext(result)); } @Test @@ -30,7 +29,6 @@ public class WasmCodeGenPushStringTests { var result = WasmCodeGen.generateInstruction(Instructions.pushString("hello"), context); result = WasmCodeGen.generateInstruction(Instructions.pushString("world"), result); - var module = result.toFunction().toModule(); - snapshotter.assertSnapshot(objdump(module)); + snapshotter.assertSnapshot(objdumpContext(result)); } } diff --git a/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenPushUnitTests.java b/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenPushUnitTests.java index a58eb091..8c534c40 100644 --- a/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenPushUnitTests.java +++ b/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenPushUnitTests.java @@ -8,7 +8,7 @@ import org.shedlang.compiler.testing.snapshots.Snapshotter; import java.io.IOException; -import static org.shedlang.compiler.backends.wasm.structure.WasmObjdump.objdump; +import static org.shedlang.compiler.backends.wasm.WasmCodeGenTesting.objdumpContext; @ExtendWith({SnapshotResolver.class}) public class WasmCodeGenPushUnitTests { @@ -19,7 +19,6 @@ public class WasmCodeGenPushUnitTests { var result = WasmCodeGen.generateInstruction(instruction, context); - var module = result.toFunction().toModule(); - snapshotter.assertSnapshot(objdump(module)); + snapshotter.assertSnapshot(objdumpContext(result)); } } diff --git a/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenReturnTests.java b/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenReturnTests.java index 01c26402..b5bf5898 100644 --- a/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenReturnTests.java +++ b/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenReturnTests.java @@ -8,7 +8,7 @@ import org.shedlang.compiler.testing.snapshots.Snapshotter; import java.io.IOException; -import static org.shedlang.compiler.backends.wasm.structure.WasmObjdump.objdump; +import static org.shedlang.compiler.backends.wasm.WasmCodeGenTesting.objdumpContext; @ExtendWith({SnapshotResolver.class}) public class WasmCodeGenReturnTests { @@ -19,7 +19,6 @@ public class WasmCodeGenReturnTests { var result = WasmCodeGen.generateInstruction(instruction, context); - var module = result.toFunction().toModule(); - snapshotter.assertSnapshot(objdump(module)); + snapshotter.assertSnapshot(objdumpContext(result)); } } diff --git a/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenTesting.java b/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenTesting.java new file mode 100644 index 00000000..d281684b --- /dev/null +++ b/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenTesting.java @@ -0,0 +1,15 @@ +package org.shedlang.compiler.backends.wasm; + +import java.io.IOException; + +import static org.shedlang.compiler.backends.wasm.structure.WasmObjdump.objdump; + +public class WasmCodeGenTesting { + private WasmCodeGenTesting() { + } + + public static String objdumpContext(WasmCodeGenContext context) throws IOException, InterruptedException { + var module = context.toFunction("f").toModule(); + return objdump(module); + } +} -- cgit v1.2.3