aboutsummaryrefslogtreecommitdiff
path: root/src
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
parent2047794b40b140675ef6f5ae7be83ae4ae603e02 (diff)
Store total element count in tuple-get instruction
Diffstat (limited to 'src')
-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
-rw-r--r--src/test/java/org/shedlang/compiler/patio/PatioCodeGenTupleGetTests.java2
-rw-r--r--src/test/java/org/shedlang/compiler/stackir/InstructionSerializerTests.java4
-rw-r--r--src/test/java/org/shedlang/compiler/stackir/instructions/Instructions.java4
7 files changed, 14 insertions, 9 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 {
}
diff --git a/src/test/java/org/shedlang/compiler/patio/PatioCodeGenTupleGetTests.java b/src/test/java/org/shedlang/compiler/patio/PatioCodeGenTupleGetTests.java
index d50b8022..fc1cf272 100644
--- a/src/test/java/org/shedlang/compiler/patio/PatioCodeGenTupleGetTests.java
+++ b/src/test/java/org/shedlang/compiler/patio/PatioCodeGenTupleGetTests.java
@@ -15,7 +15,7 @@ import static org.shedlang.compiler.patio.PatioTesting.serialize;
public class PatioCodeGenTupleGetTests {
@Test
public void canGenerateCodeForTupleGet(Snapshotter snapshotter) throws IOException {
- var stackIr = Instructions.tupleGet(2);
+ var stackIr = Instructions.tupleGet(2, 3);
var context = PatioCodeGenContext.EMPTY
.temporaryPush(new PatioLocalRef("a"))
.temporaryPush(new PatioLocalRef("b"));
diff --git a/src/test/java/org/shedlang/compiler/stackir/InstructionSerializerTests.java b/src/test/java/org/shedlang/compiler/stackir/InstructionSerializerTests.java
index d6f4b830..b9166fac 100644
--- a/src/test/java/org/shedlang/compiler/stackir/InstructionSerializerTests.java
+++ b/src/test/java/org/shedlang/compiler/stackir/InstructionSerializerTests.java
@@ -305,11 +305,11 @@ public class InstructionSerializerTests {
@Test
public void canSerializeTupleGet() {
- var instruction = Instructions.tupleGet(2);
+ var instruction = Instructions.tupleGet(2, 3);
var string = serialize(instruction);
- assertThat(string, equalTo("(tuple-get 2)"));
+ assertThat(string, equalTo("(tuple-get 2 3)"));
}
@Test
diff --git a/src/test/java/org/shedlang/compiler/stackir/instructions/Instructions.java b/src/test/java/org/shedlang/compiler/stackir/instructions/Instructions.java
index 126ad1fa..ae1e0a4c 100644
--- a/src/test/java/org/shedlang/compiler/stackir/instructions/Instructions.java
+++ b/src/test/java/org/shedlang/compiler/stackir/instructions/Instructions.java
@@ -110,8 +110,8 @@ public class Instructions {
return new TupleCreateInstruction(elementCount, Sources.NULL);
}
- public static Instruction tupleGet(int elementIndex) {
- return new TupleGetInstruction(elementIndex, Sources.NULL);
+ public static Instruction tupleGet(int elementIndex, int elementCount) {
+ return new TupleGetInstruction(elementIndex, elementCount, Sources.NULL);
}
public static Instruction varLoad(String name) {