diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-07-23 21:15:18 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-07-23 21:15:36 +0100 |
| commit | 576aa4821a810353e4a8eb3dbc92a4cbe1be723e (patch) | |
| tree | f72f5dd403e37a7f17d3ef51e946cc93673b7c42 /src/main/java | |
| parent | 6a3d3bdf076847f0606ccb3bc96f3fb87b87c549 (diff) | |
Update Patio if to support results
Diffstat (limited to 'src/main/java')
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 { } |
