diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-07-14 21:43:06 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-07-14 21:43:06 +0100 |
| commit | 1a7c4eba61bd9c055c2e3e19fffbae10b5317197 (patch) | |
| tree | 648a5c250fb594210baa821f438896b800a8e0ac /src/main/java | |
| parent | 0b8c4b6a27838e89ff49e1ab66bf2ed4378ec7da (diff) | |
Handle ifs with multiple conditional branches
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/stackir/StackCompiler.java | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java b/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java index e062ab78..85d3cc5a 100644 --- a/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java +++ b/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java @@ -4,6 +4,7 @@ import org.pcollections.PVector; import org.shedlang.compiler.ShedBuiltins; import org.shedlang.compiler.ast.typed.*; import org.shedlang.compiler.stackir.instructions.*; +import org.shedlang.compiler.util.Lists; import org.shedlang.compiler.util.P; import org.shedlang.compiler.util.PCollectors; @@ -164,16 +165,21 @@ public class StackCompiler { } private static PVector<Instruction> compileIf(TypedIfNode node) { - var conditionalBranch = node.conditionalBranches().get(0); - var conditionInstructions = compileExpression(conditionalBranch.condition()); + var instructions = compileBlock(node.elseBody()); - var ifInstruction = new IfInstruction( - compileBlock(conditionalBranch.body()), - compileBlock(node.elseBody()), - node.source() - ); + for (var conditionalBranch : Lists.reversed(node.conditionalBranches())) { + var conditionInstructions = compileExpression(conditionalBranch.condition()); + + var ifInstruction = new IfInstruction( + compileBlock(conditionalBranch.body()), + instructions, + node.source() + ); - return conditionInstructions.plus(ifInstruction); + instructions = conditionInstructions.plus(ifInstruction); + } + + return instructions; } private static PVector<Instruction> compileIntLiteral(TypedIntLiteralNode node) { |
