From fccdbaa4487a4b3d10fa6e554ae9c73d11c12ebc Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Wed, 19 Jul 2023 20:49:13 +0100 Subject: Add alloc instruction to Patio IR --- src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java | 4 ++-- .../shedlang/compiler/patio/PatioInstructionSerializer.java | 6 +++++- .../org/shedlang/compiler/patio/instructions/PatioAlloc.java | 10 ++++++++++ .../shedlang/compiler/patio/instructions/PatioInstruction.java | 2 +- .../compiler/patio/PatioInstructionSerializerTests.java | 9 +++++++++ .../java/org/shedlang/compiler/patio/instructions/Patio.java | 4 ++++ 6 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 src/main/java/org/shedlang/compiler/patio/instructions/PatioAlloc.java (limited to 'src') diff --git a/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java b/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java index 790bf8d7..dfe1e04b 100644 --- a/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java +++ b/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java @@ -17,8 +17,8 @@ public class PatioCodeGen { case DiscardInstruction discard -> P.vector(new PatioDiscard(discard.source())); - case ReturnInstruction discard -> - P.vector(new PatioReturn(discard.source())); + case ReturnInstruction return_ -> + P.vector(new PatioReturn(return_.source())); default -> throw new IllegalStateException("Unexpected value: " + stackIrInstruction); diff --git a/src/main/java/org/shedlang/compiler/patio/PatioInstructionSerializer.java b/src/main/java/org/shedlang/compiler/patio/PatioInstructionSerializer.java index 523eabc7..382c4125 100644 --- a/src/main/java/org/shedlang/compiler/patio/PatioInstructionSerializer.java +++ b/src/main/java/org/shedlang/compiler/patio/PatioInstructionSerializer.java @@ -1,5 +1,6 @@ package org.shedlang.compiler.patio; +import org.shedlang.compiler.patio.instructions.PatioAlloc; import org.shedlang.compiler.patio.instructions.PatioDiscard; import org.shedlang.compiler.patio.instructions.PatioInstruction; import org.shedlang.compiler.patio.instructions.PatioReturn; @@ -33,10 +34,13 @@ public class PatioInstructionSerializer { private static Tree instructionToTree(PatioInstruction instruction) { return switch (instruction) { + case PatioAlloc alloc -> + treeList(treeIdentifier("alloc"), treeInt(alloc.bytes())); + case PatioDiscard discard -> treeList(treeIdentifier("discard")); - case PatioReturn patioReturn -> + case PatioReturn return_ -> treeList(treeIdentifier("return")); }; } diff --git a/src/main/java/org/shedlang/compiler/patio/instructions/PatioAlloc.java b/src/main/java/org/shedlang/compiler/patio/instructions/PatioAlloc.java new file mode 100644 index 00000000..c5ea9594 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/patio/instructions/PatioAlloc.java @@ -0,0 +1,10 @@ +package org.shedlang.compiler.patio.instructions; + +import org.shedlang.compiler.sources.Source; + +/** + * Allocate the given number of bytes, and push the pointer to the allocated + * memory onto the stack. + */ +public record PatioAlloc(int bytes, Source source) implements PatioInstruction { +} diff --git a/src/main/java/org/shedlang/compiler/patio/instructions/PatioInstruction.java b/src/main/java/org/shedlang/compiler/patio/instructions/PatioInstruction.java index 22305e84..6928d324 100644 --- a/src/main/java/org/shedlang/compiler/patio/instructions/PatioInstruction.java +++ b/src/main/java/org/shedlang/compiler/patio/instructions/PatioInstruction.java @@ -2,6 +2,6 @@ package org.shedlang.compiler.patio.instructions; import org.shedlang.compiler.sources.Source; -public sealed interface PatioInstruction permits PatioDiscard, PatioReturn { +public sealed interface PatioInstruction permits PatioAlloc, PatioDiscard, PatioReturn { Source source(); } diff --git a/src/test/java/org/shedlang/compiler/patio/PatioInstructionSerializerTests.java b/src/test/java/org/shedlang/compiler/patio/PatioInstructionSerializerTests.java index 1ea128c8..add91040 100644 --- a/src/test/java/org/shedlang/compiler/patio/PatioInstructionSerializerTests.java +++ b/src/test/java/org/shedlang/compiler/patio/PatioInstructionSerializerTests.java @@ -8,6 +8,15 @@ import static org.zwobble.precisely.AssertThat.assertThat; import static org.zwobble.precisely.Matchers.equalTo; public class PatioInstructionSerializerTests { + @Test + public void canSerializeAlloc() { + var instruction = Patio.alloc(42); + + var string = serialize(instruction); + + assertThat(string, equalTo("(alloc 42)")); + } + @Test public void canSerializeDiscard() { var instruction = Patio.discard(); diff --git a/src/test/java/org/shedlang/compiler/patio/instructions/Patio.java b/src/test/java/org/shedlang/compiler/patio/instructions/Patio.java index 871f45f1..ad7748bc 100644 --- a/src/test/java/org/shedlang/compiler/patio/instructions/Patio.java +++ b/src/test/java/org/shedlang/compiler/patio/instructions/Patio.java @@ -5,6 +5,10 @@ import org.shedlang.compiler.sources.Sources; public class Patio { private Patio() {} + public static PatioInstruction alloc(int bytes) { + return new PatioAlloc(bytes, Sources.NULL); + } + public static PatioInstruction discard() { return new PatioDiscard(Sources.NULL); } -- cgit v1.2.3