aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-09-23 16:17:11 +0100
committerMichael Williamson <mike@zwobble.org>2023-09-23 16:17:11 +0100
commit121bb5c7e3d141d6baade166e42b58fef7c59c1c (patch)
tree64a0537865be6673f6f5b8b577866ef83e867852 /src/main/java/org
parent2047794b40b140675ef6f5ae7be83ae4ae603e02 (diff)
Store total element count in tuple-get instruction
Diffstat (limited to 'src/main/java/org')
-rw-r--r--src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java3
-rw-r--r--src/main/java/org/shedlang/compiler/stackir/InstructionSerializer.java3
-rw-r--r--src/main/java/org/shedlang/compiler/stackir/StackCompiler.java6
-rw-r--r--src/main/java/org/shedlang/compiler/stackir/instructions/TupleGetInstruction.java1
4 files changed, 9 insertions, 4 deletions
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 {
}