aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-09-17 19:17:19 +0100
committerMichael Williamson <mike@zwobble.org>2023-09-17 19:17:19 +0100
commitc8f15e5863666484de5e55a47079688d1f9d625a (patch)
treeb8d531d16f094951d3f3b315e1e095e4d2ff7f8d /src/main/java
parent1232307b381528fd21411a602e7a125fdee1fffb (diff)
Add duplicate instruction
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java3
-rw-r--r--src/main/java/org/shedlang/compiler/stackir/InstructionSerializer.java5
-rw-r--r--src/main/java/org/shedlang/compiler/stackir/instructions/DuplicateInstruction.java9
-rw-r--r--src/main/java/org/shedlang/compiler/stackir/instructions/Instruction.java2
4 files changed, 18 insertions, 1 deletions
diff --git a/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java b/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java
index e6e3ba0a..4922bf14 100644
--- a/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java
+++ b/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java
@@ -225,6 +225,9 @@ public class PatioCodeGen {
case DiscardInstruction discard ->
context.temporaryPop().context();
+ case DuplicateInstruction duplicate ->
+ throw new UnsupportedOperationException("TODO");
+
case FieldLoadInstruction fieldLoad -> {
var receiverResult = context.temporaryPop();
var receiver = receiverResult.value();
diff --git a/src/main/java/org/shedlang/compiler/stackir/InstructionSerializer.java b/src/main/java/org/shedlang/compiler/stackir/InstructionSerializer.java
index 875dbcec..fef6ce82 100644
--- a/src/main/java/org/shedlang/compiler/stackir/InstructionSerializer.java
+++ b/src/main/java/org/shedlang/compiler/stackir/InstructionSerializer.java
@@ -76,6 +76,11 @@ public class InstructionSerializer {
treeIdentifier("discard")
);
+ case DuplicateInstruction duplicate ->
+ treeList(
+ treeIdentifier("duplicate")
+ );
+
case FieldLoadInstruction fieldLoad ->
treeList(
treeIdentifier("field-load"),
diff --git a/src/main/java/org/shedlang/compiler/stackir/instructions/DuplicateInstruction.java b/src/main/java/org/shedlang/compiler/stackir/instructions/DuplicateInstruction.java
new file mode 100644
index 00000000..0d4aee1d
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/stackir/instructions/DuplicateInstruction.java
@@ -0,0 +1,9 @@
+package org.shedlang.compiler.stackir.instructions;
+
+import org.shedlang.compiler.sources.Source;
+
+/**
+ * Duplicates the value on top of the stack.
+ */
+public record DuplicateInstruction(Source source) implements Instruction {
+}
diff --git a/src/main/java/org/shedlang/compiler/stackir/instructions/Instruction.java b/src/main/java/org/shedlang/compiler/stackir/instructions/Instruction.java
index 29703869..87466287 100644
--- a/src/main/java/org/shedlang/compiler/stackir/instructions/Instruction.java
+++ b/src/main/java/org/shedlang/compiler/stackir/instructions/Instruction.java
@@ -3,7 +3,7 @@ package org.shedlang.compiler.stackir.instructions;
import org.shedlang.compiler.sources.Source;
public sealed interface Instruction
- permits CallInstruction, DefineFunctionInstruction, DiscardInstruction, FieldLoadInstruction, IfInstruction, IntAddInstruction, IntEqualsInstruction, IntNotEqualInstruction, IntSubInstruction, LocalLoadInstruction, LocalStoreInstruction, LoopBreakInstruction, LoopContinueInstruction, LoopInstruction, NamespaceFieldStoreInstruction, NamespaceImportInstruction, PushBoolInstruction, PushIntInstruction, PushStringInstruction, PushUnitInstruction, ReturnInstruction, StringAddInstruction, TupleCreateInstruction, TupleGetInstruction, VarLoadInstruction, VarStoreInstruction {
+ permits CallInstruction, DefineFunctionInstruction, DiscardInstruction, DuplicateInstruction, FieldLoadInstruction, IfInstruction, IntAddInstruction, IntEqualsInstruction, IntNotEqualInstruction, IntSubInstruction, LocalLoadInstruction, LocalStoreInstruction, LoopBreakInstruction, LoopContinueInstruction, LoopInstruction, NamespaceFieldStoreInstruction, NamespaceImportInstruction, PushBoolInstruction, PushIntInstruction, PushStringInstruction, PushUnitInstruction, ReturnInstruction, StringAddInstruction, TupleCreateInstruction, TupleGetInstruction, VarLoadInstruction, VarStoreInstruction {
Source source();
}