aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-21 12:25:13 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-21 12:25:13 +0100
commit6f4e1ae90880d94d23219a0a97774b2df4e04b56 (patch)
treed82ccc92887df8a91c7df36f9d61e113ed13402f /src
parentbe3f205c4ac85609028528d598adcc218890017b (diff)
Add direct call instruction
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java21
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioCall.java20
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioInstruction.java2
-rw-r--r--src/test/java/org/shedlang/compiler/patio/PatioSerializerTests.java31
-rw-r--r--src/test/java/org/shedlang/compiler/patio/instructions/Patio.java20
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,