aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-23 21:15:18 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-23 21:15:36 +0100
commit576aa4821a810353e4a8eb3dbc92a4cbe1be723e (patch)
treef72f5dd403e37a7f17d3ef51e946cc93673b7c42 /src/main/java
parent6a3d3bdf076847f0606ccb3bc96f3fb87b87c549 (diff)
Update Patio if to support results
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java4
-rw-r--r--src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java4
-rw-r--r--src/main/java/org/shedlang/compiler/patio/PatioCodeGenNamespaces.java25
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java24
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioBlock.java13
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioIf.java8
6 files changed, 62 insertions, 16 deletions
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 8d9127f6..43e40d10 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java
@@ -286,13 +286,13 @@ public class LlvmPatioCodeGen {
));
context = context.setBasicBlockLabel(ifTrueLabel.name());
- context = generateInstructions(patioIf.trueBody(), context);
+ context = generateInstructions(patioIf.trueBody().body(), context);
// TODO: remove this hack!
var ifTrueEndLabel = context.basicBlockLabel.orElseThrow();
context = context.addTerminatorInstruction(new LlvmBrUnconditional(endLabel.name()));
context = context.setBasicBlockLabel(ifFalseLabel.name());
- context = generateInstructions(patioIf.falseBody(), context);
+ context = generateInstructions(patioIf.falseBody().body(), context);
// TODO: remove this hack!
var ifFalseEndLabel = context.basicBlockLabel.orElseThrow();
context = context.addTerminatorInstruction(new LlvmBrUnconditional(endLabel.name()));
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 43a7dadf..6ec4e39f 100644
--- a/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java
+++ b/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java
@@ -188,12 +188,12 @@ public class WasmPatioCodeGen {
context = generateOperand(patioIf.condition(), context);
context = context.enterBlock();
- context = generateInstructions(patioIf.trueBody(), context);
+ context = generateInstructions(patioIf.trueBody().body(), context);
var wasmTrueBody = context.instructions;
context = context.exitBlock();
context = context.enterBlock();
- context = generateInstructions(patioIf.falseBody(), context);
+ context = generateInstructions(patioIf.falseBody().body(), context);
var wasmFalseBody = context.instructions;
context = context.exitBlock();
diff --git a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenNamespaces.java b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenNamespaces.java
index 33bc3b62..afec18f4 100644
--- a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenNamespaces.java
+++ b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenNamespaces.java
@@ -91,15 +91,24 @@ public class PatioCodeGenNamespaces {
));
importContext = importContext.addInstruction(new PatioIf(
- isInited,
List.of(),
- List.of(
- new PatioCall(
- Optional.empty(),
- globalNameNamespaceInit(namespaceName),
- List.of(),
- source
- )
+ isInited,
+ new PatioBlock(
+ List.of(),
+ List.of(),
+ source
+ ),
+ new PatioBlock(
+ List.of(
+ new PatioCall(
+ Optional.empty(),
+ globalNameNamespaceInit(namespaceName),
+ List.of(),
+ source
+ )
+ ),
+ List.of(),
+ source
),
source
));
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 530a95f0..0154d11b 100644
--- a/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java
+++ b/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java
@@ -186,9 +186,14 @@ public class PatioSerializer {
case PatioIf if_ ->
treeListIndented(
treeIdentifier("if"),
+ treeList(
+ if_.targets().stream()
+ .map(target -> operandToTree(target))
+ .toList()
+ ),
operandToTree(if_.condition()),
- instructionsToTree(if_.trueBody()),
- instructionsToTree(if_.falseBody())
+ blockToTree(if_.trueBody()),
+ blockToTree(if_.falseBody())
);
case PatioIntAdd intAdd ->
@@ -262,6 +267,21 @@ public class PatioSerializer {
};
}
+ private static Tree blockToTree(PatioBlock block) {
+ return treeListIndented(
+ treeIdentifier("block"),
+ instructionsToTree(block.body()),
+ treeNamed(
+ "results",
+ treeList(
+ block.results().stream()
+ .map(result -> operandToTree(result))
+ .toList()
+ )
+ )
+ );
+ }
+
private static Tree localToTree(PatioLocal local) {
return treeList(treeString(local.name()), typeToTree(local.type()));
}
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioBlock.java b/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioBlock.java
new file mode 100644
index 00000000..8eecfa84
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioBlock.java
@@ -0,0 +1,13 @@
+package org.shedlang.compiler.patio.ast.instructions;
+
+import org.shedlang.compiler.patio.ast.operands.PatioOperand;
+import org.shedlang.compiler.sources.Source;
+
+import java.util.List;
+
+public record PatioBlock(
+ List<PatioInstruction> body,
+ List<PatioOperand> results,
+ Source source
+) {
+}
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioIf.java b/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioIf.java
index 87de0735..4f7a8700 100644
--- a/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioIf.java
+++ b/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioIf.java
@@ -8,11 +8,15 @@ import java.util.List;
/**
* If the condition is true, execute the instructions in the "true" body,
* otherwise execute the instructions in the "false" body.
+ *
+ * Each block must return the same number of results as targets. Each result
+ * is assigned to the target with the same index.
*/
public record PatioIf(
+ List<PatioLocalRef> targets,
PatioLocalRef condition,
- List<PatioInstruction> trueBody,
- List<PatioInstruction> falseBody,
+ PatioBlock trueBody,
+ PatioBlock falseBody,
Source source
) implements PatioInstruction {
}