From b0a288f03774d3df6f4502af7748a52012e05029 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 8 Oct 2023 11:38:53 +0100 Subject: Generate Patio code for stack IR switch instruction --- .../org/shedlang/compiler/patio/PatioCodeGen.java | 49 +++++++++++++++++++++- 1 file changed, 47 insertions(+), 2 deletions(-) (limited to 'src/main/java') 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(); + + 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(); -- cgit v1.2.3