diff options
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/stackir/StackCompiler.java | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java b/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java index 12a32125..8c5bea8c 100644 --- a/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java +++ b/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java @@ -384,7 +384,23 @@ public class StackCompiler { } case TypedTargetNode.Tuple tuple -> { - throw new UnsupportedOperationException("TODO"); + if (tuple.elements().size() == 0) { + context = context.addInstruction(new DiscardInstruction(tuple.source())); + } + + for (var elementIndex = 0; elementIndex < tuple.elements().size(); elementIndex++) { + if (elementIndex < tuple.elements().size() - 1) { + context = context + .addInstruction(new DuplicateInstruction(tuple.source())); + } + + context = context + .addInstruction(new TupleGetInstruction(elementIndex, tuple.source())); + + context = compileTarget(tuple.elements().get(elementIndex), context); + } + + yield context; } case TypedTargetNode.Val val -> { |
