From 121bb5c7e3d141d6baade166e42b58fef7c59c1c Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 23 Sep 2023 16:17:11 +0100 Subject: Store total element count in tuple-get instruction --- src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java | 3 +-- .../java/org/shedlang/compiler/stackir/InstructionSerializer.java | 3 ++- src/main/java/org/shedlang/compiler/stackir/StackCompiler.java | 6 +++++- .../shedlang/compiler/stackir/instructions/TupleGetInstruction.java | 1 + 4 files changed, 9 insertions(+), 4 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 b92d7850..da11f1be 100644 --- a/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java +++ b/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java @@ -533,7 +533,6 @@ public class PatioCodeGen { } case TupleGetInstruction tupleGet -> { - // TODO: store tuple type in case we want out-of-order fields? var tupleResult = context.temporaryPop(); var tuple = tupleResult.value(); context = tupleResult.context(); @@ -564,7 +563,7 @@ public class PatioCodeGen { tuplePointer, PatioDataLayouts.struct(Lists.repeat( PatioDataLayouts.INT, - tupleGet.elementIndex() + 1 + tupleGet.elementCount() )), List.of(tupleGet.elementIndex()), tupleGet.source() diff --git a/src/main/java/org/shedlang/compiler/stackir/InstructionSerializer.java b/src/main/java/org/shedlang/compiler/stackir/InstructionSerializer.java index fef6ce82..d8ded6d3 100644 --- a/src/main/java/org/shedlang/compiler/stackir/InstructionSerializer.java +++ b/src/main/java/org/shedlang/compiler/stackir/InstructionSerializer.java @@ -185,7 +185,8 @@ public class InstructionSerializer { case TupleGetInstruction tupleGetInstruction -> treeList( treeIdentifier("tuple-get"), - treeInt(tupleGetInstruction.elementIndex()) + treeInt(tupleGetInstruction.elementIndex()), + treeInt(tupleGetInstruction.elementCount()) ); case VarLoadInstruction varLoadInstruction -> diff --git a/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java b/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java index 8c5bea8c..d036eebe 100644 --- a/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java +++ b/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java @@ -395,7 +395,11 @@ public class StackCompiler { } context = context - .addInstruction(new TupleGetInstruction(elementIndex, tuple.source())); + .addInstruction(new TupleGetInstruction( + elementIndex, + tuple.elements().size(), + tuple.source() + )); context = compileTarget(tuple.elements().get(elementIndex), context); } diff --git a/src/main/java/org/shedlang/compiler/stackir/instructions/TupleGetInstruction.java b/src/main/java/org/shedlang/compiler/stackir/instructions/TupleGetInstruction.java index b621a336..bf2e0456 100644 --- a/src/main/java/org/shedlang/compiler/stackir/instructions/TupleGetInstruction.java +++ b/src/main/java/org/shedlang/compiler/stackir/instructions/TupleGetInstruction.java @@ -8,6 +8,7 @@ import org.shedlang.compiler.sources.Source; */ public record TupleGetInstruction( int elementIndex, + int elementCount, Source source ) implements Instruction { } -- cgit v1.2.3