From 6f4e1ae90880d94d23219a0a97774b2df4e04b56 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 21 Jul 2023 12:25:13 +0100 Subject: Add direct call instruction --- .../compiler/patio/PatioSerializerTests.java | 31 ++++++++++++++++++++++ .../compiler/patio/instructions/Patio.java | 20 +++++++++++++- 2 files changed, 50 insertions(+), 1 deletion(-) (limited to 'src/test/java') diff --git a/src/test/java/org/shedlang/compiler/patio/PatioSerializerTests.java b/src/test/java/org/shedlang/compiler/patio/PatioSerializerTests.java index d387bf8b..9ca59e7d 100644 --- a/src/test/java/org/shedlang/compiler/patio/PatioSerializerTests.java +++ b/src/test/java/org/shedlang/compiler/patio/PatioSerializerTests.java @@ -7,6 +7,7 @@ import org.shedlang.compiler.patio.ast.types.PatioTypes; import org.shedlang.compiler.patio.instructions.Patio; import java.util.List; +import java.util.Optional; import static org.zwobble.precisely.AssertThat.assertThat; import static org.zwobble.precisely.Matchers.equalTo; @@ -97,6 +98,36 @@ public class PatioSerializerTests { assertThat(string, equalTo("(alloc (local \"x\") (struct (int int data-ptr)))")); } + @Test + public void canSerializeCallWithoutTarget() { + var instruction = Patio.call( + Optional.empty(), + "f", + List.of(Patio.localRef("a"), Patio.localRef("b"), Patio.localRef("c")) + ); + + var string = PatioTesting.serializeInstruction(instruction); + + assertThat(string, equalTo(""" + (call _ "f" ((local "a") (local "b") (local "c")))""" + )); + } + + @Test + public void canSerializeCallWithTarget() { + var instruction = Patio.call( + Optional.of(Patio.localRef("target")), + "f", + List.of(Patio.localRef("a"), Patio.localRef("b"), Patio.localRef("c")) + ); + + var string = PatioTesting.serializeInstruction(instruction); + + assertThat(string, equalTo(""" + (call (local "target") "f" ((local "a") (local "b") (local "c")))""" + )); + } + @Test public void canSerializeCallPointer() { var instruction = Patio.callPointer( 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 9df05a5c..dd505326 100644 --- a/src/test/java/org/shedlang/compiler/patio/instructions/Patio.java +++ b/src/test/java/org/shedlang/compiler/patio/instructions/Patio.java @@ -1,6 +1,9 @@ package org.shedlang.compiler.patio.instructions; -import org.shedlang.compiler.patio.ast.*; +import org.shedlang.compiler.patio.ast.PatioCompilationUnit; +import org.shedlang.compiler.patio.ast.PatioCompilationUnitElement; +import org.shedlang.compiler.patio.ast.PatioDataElement; +import org.shedlang.compiler.patio.ast.PatioLocal; import org.shedlang.compiler.patio.ast.instructions.*; import org.shedlang.compiler.patio.ast.operands.*; import org.shedlang.compiler.patio.ast.types.PatioDataLayout; @@ -8,6 +11,7 @@ import org.shedlang.compiler.patio.ast.types.PatioType; import org.shedlang.compiler.sources.Sources; import java.util.List; +import java.util.Optional; public class Patio { private Patio() {} @@ -19,6 +23,20 @@ public class Patio { public static PatioOperand bool(boolean value) { return new PatioBool(value); } + + public static PatioInstruction call( + Optional target, + String name, + List args + ) { + return new PatioCall( + target, + name, + args, + Sources.NULL + ); + } + public static PatioInstruction callPointer( String target, String functionPointer, -- cgit v1.2.3