diff options
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java | 35 |
1 files changed, 29 insertions, 6 deletions
diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java b/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java index 80940a9e..bbf8298d 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java @@ -260,14 +260,37 @@ public class WasmPatioCodeGen { context ); - case PatioLoop patioLoop -> - throw new UnsupportedOperationException("TODO"); + case PatioLoop patioLoop -> { + context = context.enterBlock(); + context = generateInstructions(patioLoop.body(), context); + var bodyInstructions = context.instructions; + context = context.exitBlock(); + + context = context.addInstruction(new WasmBlock( + new WasmBlockType(List.of()), + List.of( + new WasmLoop( + new WasmBlockType(List.of()), + bodyInstructions + ) + ) + )); + + yield context; + } + + case PatioLoopBreak patioLoopBreak -> { + // TODO: track label indices properly + context = context.addInstruction(new WasmBr(2)); - case PatioLoopBreak patioLoopBreak -> - throw new UnsupportedOperationException("TODO"); + yield context; + } + + case PatioLoopContinue patioLoopContinue -> { + context = context.addInstruction(new WasmBr(0)); - case PatioLoopContinue patioLoopContinue -> - throw new UnsupportedOperationException("TODO"); + yield context; + } case PatioMemoryLoad patioMemoryLoad -> { context = generateOperand(patioMemoryLoad.pointer(), context); |
