aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-14 19:09:14 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-14 19:09:14 +0100
commit8a0add6981fef214b910a5fce4f79561b85e3d0d (patch)
tree6948f23e250e512c2dd66cb4dccd26f6fac127b1 /src/test/java
parent49242673624952d4c6f7a01123f4c762c6efb385 (diff)
Compile zero-arg calls
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerCallTests.java38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerCallTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerCallTests.java
new file mode 100644
index 00000000..45af4ac3
--- /dev/null
+++ b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerCallTests.java
@@ -0,0 +1,38 @@
+package org.shedlang.compiler.backends.llvm;
+
+import org.junit.jupiter.api.Test;
+import org.shedlang.compiler.backends.llvm.ir.ast.LlvmIr;
+import org.shedlang.compiler.backends.llvm.ir.ast.instructions.LlvmCall;
+import org.shedlang.compiler.stackir.instructions.Instructions;
+
+import java.util.List;
+
+import static org.shedlang.compiler.backends.llvm.ir.ast.LlvmIrMatchers.isLlvmVariableLocal;
+import static org.zwobble.precisely.AssertThat.assertThat;
+import static org.zwobble.precisely.Matchers.*;
+
+public class LlvmCompilerCallTests {
+ @Test
+ public void canCallFunctionWithNoArgs() {
+ var instruction = Instructions.call(0, List.of());
+ var context = LlvmCompilerContext.EMPTY
+ .push(LlvmIr.variableLocal("x"))
+ .push(LlvmIr.variableLocal("f"));
+
+ var result = LlvmCompiler.compileInstruction(instruction, context);
+
+ assertThat(result.instructions(), isSequence(
+ instanceOf(
+ LlvmCall.class,
+ has("target", x -> x.target(), isLlvmVariableLocal("tmp__0")),
+ has("returnType", x -> x.returnType(), equalTo(LlvmCompilerTypes.VALUE_TYPE)),
+ has("functionPointer", x -> x.functionPointer(), isLlvmVariableLocal("f")),
+ has("args", x -> x.args(), isSequence())
+ )
+ ));
+ assertThat(result.stack(), isSequence(
+ isLlvmVariableLocal("tmp__0"),
+ isLlvmVariableLocal("x")
+ ));
+ }
+}