diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-07-21 12:25:13 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-07-21 12:25:13 +0100 |
| commit | 6f4e1ae90880d94d23219a0a97774b2df4e04b56 (patch) | |
| tree | d82ccc92887df8a91c7df36f9d61e113ed13402f /src | |
| parent | be3f205c4ac85609028528d598adcc218890017b (diff) | |
Add direct call instruction
Diffstat (limited to 'src')
5 files changed, 92 insertions, 2 deletions
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 09768a6e..25552eb2 100644 --- a/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java +++ b/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java @@ -6,6 +6,7 @@ import org.shedlang.compiler.patio.ast.types.*; import org.shedlang.compiler.treetext.Tree; import java.util.List; +import java.util.Optional; import static org.shedlang.compiler.treetext.TreeSerializer.serializeTree; import static org.shedlang.compiler.treetext.Trees.*; @@ -117,6 +118,18 @@ public class PatioSerializer { dataLayoutToTree(alloc.layout()) ); + case PatioCall call -> + treeList( + treeIdentifier("call"), + optionalOperandToTree(call.target()), + treeString(call.functionName()), + treeList( + call.args().stream() + .map(arg -> operandToTree(arg)) + .toList() + ) + ); + case PatioCallPointer callPointer -> treeList( treeIdentifier("call-pointer"), @@ -204,6 +217,14 @@ public class PatioSerializer { return treeList(treeString(local.name()), typeToTree(local.type())); } + private static Tree optionalOperandToTree(Optional<PatioLocalRef> target) { + if (target.isEmpty()) { + return treeIdentifier("_"); + } else { + return operandToTree(target.get()); + } + } + private static Tree operandToTree(PatioOperand operand) { return switch (operand) { case PatioBool bool -> diff --git a/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioCall.java b/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioCall.java new file mode 100644 index 00000000..c74613bb --- /dev/null +++ b/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioCall.java @@ -0,0 +1,20 @@ +package org.shedlang.compiler.patio.ast.instructions; + +import org.shedlang.compiler.patio.ast.operands.PatioLocalRef; +import org.shedlang.compiler.patio.ast.operands.PatioOperand; +import org.shedlang.compiler.sources.Source; + +import java.util.List; +import java.util.Optional; + +/** + * Call the function with the given name, and store the returned value in the + * target local. + */ +public record PatioCall( + Optional<PatioLocalRef> target, + String functionName, + List<PatioOperand> args, + Source source +) implements PatioInstruction { +} 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 eb9e5ea5..9edeb532 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 PatioAlloc, PatioCallPointer, PatioDataPtrToInt, PatioIf, PatioIntAdd, PatioIntToDataPtr, PatioLocalStore, PatioMemoryLoad, PatioMemoryStore, PatioReturn { +public sealed interface PatioInstruction permits PatioAlloc, PatioCall, PatioCallPointer, PatioDataPtrToInt, PatioIf, PatioIntAdd, PatioIntToDataPtr, PatioLocalStore, PatioMemoryLoad, PatioMemoryStore, PatioReturn { Source source(); } diff --git a/src/test/java/org/shedlang/compiler/patio/PatioSerializerTests.java b/src/test/java/org/shedlang/compiler/patio/PatioSerializerTests.java index d387bf8b..9ca59e7d 100644 --- a/src/test/java/org/shedlang/compiler/patio/PatioSerializerTests.java +++ b/src/test/java/org/shedlang/compiler/patio/PatioSerializerTests.java @@ -7,6 +7,7 @@ import org.shedlang.compiler.patio.ast.types.PatioTypes; import org.shedlang.compiler.patio.instructions.Patio; import java.util.List; +import java.util.Optional; import static org.zwobble.precisely.AssertThat.assertThat; import static org.zwobble.precisely.Matchers.equalTo; @@ -98,6 +99,36 @@ public class PatioSerializerTests { } @Test + public void canSerializeCallWithoutTarget() { + var instruction = Patio.call( + Optional.empty(), + "f", + List.of(Patio.localRef("a"), Patio.localRef("b"), Patio.localRef("c")) + ); + + var string = PatioTesting.serializeInstruction(instruction); + + assertThat(string, equalTo(""" + (call _ "f" ((local "a") (local "b") (local "c")))""" + )); + } + + @Test + public void canSerializeCallWithTarget() { + var instruction = Patio.call( + Optional.of(Patio.localRef("target")), + "f", + List.of(Patio.localRef("a"), Patio.localRef("b"), Patio.localRef("c")) + ); + + var string = PatioTesting.serializeInstruction(instruction); + + assertThat(string, equalTo(""" + (call (local "target") "f" ((local "a") (local "b") (local "c")))""" + )); + } + + @Test public void canSerializeCallPointer() { var instruction = Patio.callPointer( "target", 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 9df05a5c..dd505326 100644 --- a/src/test/java/org/shedlang/compiler/patio/instructions/Patio.java +++ b/src/test/java/org/shedlang/compiler/patio/instructions/Patio.java @@ -1,6 +1,9 @@ package org.shedlang.compiler.patio.instructions; -import org.shedlang.compiler.patio.ast.*; +import org.shedlang.compiler.patio.ast.PatioCompilationUnit; +import org.shedlang.compiler.patio.ast.PatioCompilationUnitElement; +import org.shedlang.compiler.patio.ast.PatioDataElement; +import org.shedlang.compiler.patio.ast.PatioLocal; import org.shedlang.compiler.patio.ast.instructions.*; import org.shedlang.compiler.patio.ast.operands.*; import org.shedlang.compiler.patio.ast.types.PatioDataLayout; @@ -8,6 +11,7 @@ import org.shedlang.compiler.patio.ast.types.PatioType; import org.shedlang.compiler.sources.Sources; import java.util.List; +import java.util.Optional; public class Patio { private Patio() {} @@ -19,6 +23,20 @@ public class Patio { public static PatioOperand bool(boolean value) { return new PatioBool(value); } + + public static PatioInstruction call( + Optional<PatioLocalRef> target, + String name, + List<PatioOperand> args + ) { + return new PatioCall( + target, + name, + args, + Sources.NULL + ); + } + public static PatioInstruction callPointer( String target, String functionPointer, |
