From 96ac268ff5f1ae25915c19f4d7810dbdccb4dc60 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 3 Dec 2023 11:50:45 +0000 Subject: Add return-void instruction to Patio --- .../org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java | 3 +++ .../org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java | 4 ++++ .../java/org/shedlang/compiler/patio/ast/PatioSerializer.java | 5 +++++ .../compiler/patio/ast/instructions/PatioInstruction.java | 2 +- .../compiler/patio/ast/instructions/PatioReturnVoid.java | 9 +++++++++ .../java/org/shedlang/compiler/patio/PatioSerializerTests.java | 9 +++++++++ .../java/org/shedlang/compiler/patio/instructions/Patio.java | 4 ++++ 7 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioReturnVoid.java (limited to 'src') diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java index 12c58729..2129ebc6 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java @@ -554,6 +554,9 @@ public class LlvmPatioCodeGen { patioOperandToLlvmOperand(patioReturn.value(), context) )); + case PatioReturnVoid patioReturnVoid -> + throw new UnsupportedOperationException("TODO"); + case PatioSwitch patioSwitch -> { var switchDefaultStartLabelResult = context.allocateLocalName( LlvmCodeGenLocalVariableSpace.SWITCH_DEFAULT_START 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 3f7e7eca..f83aa2d3 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java @@ -321,6 +321,10 @@ public class WasmPatioCodeGen { yield context; } + case PatioReturnVoid patioReturnVoid -> { + throw new UnsupportedOperationException("TODO"); + } + case PatioSwitch patioSwitch -> { // TODO: use br_table? var wasmBlockType = generateBlockType(patioSwitch.targets()); diff --git a/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java b/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java index 9ccc2766..fcb9fd52 100644 --- a/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java +++ b/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java @@ -301,6 +301,11 @@ public class PatioSerializer { operandToTree(return_.value()) ); + case PatioReturnVoid returnVoid -> + treeList( + treeIdentifier("return-void") + ); + case PatioSwitch switch_ -> treeListIndented( treeIdentifier("switch"), diff --git a/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioInstruction.java b/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioInstruction.java index c02a6041..b2a0a8ad 100644 --- a/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioInstruction.java +++ b/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioInstruction.java @@ -2,6 +2,6 @@ package org.shedlang.compiler.patio.ast.instructions; import org.shedlang.compiler.sources.Source; -public sealed interface PatioInstruction permits PatioAllocHeap, PatioAllocStack, PatioBoolToInt, PatioCall, PatioCallPointer, PatioDataPtrToInt, PatioIf, PatioIntAdd, PatioIntEquals, PatioIntNotEqual, PatioIntSub, PatioIntToBool, PatioIntToDataPtr, PatioLocalStore, PatioLoop, PatioLoopBreak, PatioLoopContinue, PatioMemoryLoad, PatioMemoryStore, PatioResume, PatioReturn, PatioSwitch, PatioThrow, PatioTry, PatioUnreachable, PatioVarLoad, PatioVarStore { +public sealed interface PatioInstruction permits PatioAllocHeap, PatioAllocStack, PatioBoolToInt, PatioCall, PatioCallPointer, PatioDataPtrToInt, PatioIf, PatioIntAdd, PatioIntEquals, PatioIntNotEqual, PatioIntSub, PatioIntToBool, PatioIntToDataPtr, PatioLocalStore, PatioLoop, PatioLoopBreak, PatioLoopContinue, PatioMemoryLoad, PatioMemoryStore, PatioResume, PatioReturn, PatioReturnVoid, PatioSwitch, PatioThrow, PatioTry, PatioUnreachable, PatioVarLoad, PatioVarStore { Source source(); } diff --git a/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioReturnVoid.java b/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioReturnVoid.java new file mode 100644 index 00000000..0fc8c0cb --- /dev/null +++ b/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioReturnVoid.java @@ -0,0 +1,9 @@ +package org.shedlang.compiler.patio.ast.instructions; + +import org.shedlang.compiler.sources.Source; + +/** + * Return with no value from the current function. + */ +public record PatioReturnVoid(Source source) implements PatioInstruction { +} diff --git a/src/test/java/org/shedlang/compiler/patio/PatioSerializerTests.java b/src/test/java/org/shedlang/compiler/patio/PatioSerializerTests.java index 626c2470..23cdf596 100644 --- a/src/test/java/org/shedlang/compiler/patio/PatioSerializerTests.java +++ b/src/test/java/org/shedlang/compiler/patio/PatioSerializerTests.java @@ -473,6 +473,15 @@ public class PatioSerializerTests { assertThat(string, equalTo("(return (local \"value\"))")); } + @Test + public void canSerializeReturnVoid() { + var instruction = Patio.returnVoid(); + + var string = PatioTesting.serializeInstruction(instruction); + + assertThat(string, equalTo("(return-void)")); + } + @Test public void canSerializeSwitch() { var instruction = Patio.switch_( diff --git a/src/test/java/org/shedlang/compiler/patio/instructions/Patio.java b/src/test/java/org/shedlang/compiler/patio/instructions/Patio.java index 2f0b2a61..b424d40b 100644 --- a/src/test/java/org/shedlang/compiler/patio/instructions/Patio.java +++ b/src/test/java/org/shedlang/compiler/patio/instructions/Patio.java @@ -250,6 +250,10 @@ public class Patio { return new PatioReturn(value, Sources.NULL); } + public static PatioInstruction returnVoid() { + return new PatioReturnVoid(Sources.NULL); + } + public static PatioInstruction switch_( List targets, PatioOperand value, -- cgit v1.2.3