aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java49
1 files changed, 47 insertions, 2 deletions
diff --git a/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java b/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java
index b68bebdf..3510a249 100644
--- a/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java
+++ b/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java
@@ -512,8 +512,53 @@ public class PatioCodeGen {
context
);
- case SwitchInstruction switch_ ->
- throw new UnsupportedOperationException("TODO");
+ case SwitchInstruction switch_ -> {
+ var targetResult = context.allocateVal(
+ PatioCodeGenLocalSpace.TEMPORARY,
+ PatioCodeGenTypes.VALUE_TYPE
+ );
+ var target = targetResult.value();
+ context = targetResult.context();
+
+ var valueResult = context.temporaryPop();
+ var value = valueResult.value();
+ context = valueResult.context();
+
+ var cases = new ArrayList<PatioSwitch.Case>();
+
+ for (var stackIrCase : switch_.cases()) {
+ var bodyResult = generateBlock(
+ 1,
+ stackIrCase.body(),
+ stackIrCase.source(),
+ context
+ );
+ var body = bodyResult.value();
+ context = bodyResult.context();
+
+ cases.add(new PatioSwitch.Case(
+ context.tag(stackIrCase.caseType()),
+ body,
+ stackIrCase.source()
+ ));
+ }
+
+ context = context.addInstruction(new PatioSwitch(
+ List.of(target),
+ value,
+ cases,
+ new PatioBlock(
+ List.of(
+ new PatioUnreachable(switch_.source())
+ ),
+ List.of(),
+ switch_.source()
+ ),
+ switch_.source()
+ ));
+
+ yield context;
+ }
case TupleCreateInstruction tupleCreate -> {
var elements = new ArrayList<PatioOperand>();