aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-26 21:19:39 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-26 21:19:39 +0100
commita5b889d21b9fcfac32f6f691fa08146139065fd3 (patch)
treea4ec3af8a43a6114d2068279b45217cb03bcc7c6 /src/main/java
parent90afeef2a50e017be593267c8420df410b2cef7f (diff)
Pass in positional and named args to generate call in LLVM backend
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGen.java18
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenClosures.java13
2 files changed, 17 insertions, 14 deletions
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGen.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGen.java
index de92b4e6..7c4427b4 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGen.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGen.java
@@ -36,7 +36,7 @@ public class LlvmCodeGen {
var field = fieldResult.value();
mainContext = fieldResult.context();
- mainContext = LlvmCodeGenClosures.call(field, mainContext, List.of());
+ mainContext = LlvmCodeGenClosures.call(field, List.of(), Map.of(), mainContext);
mainContext = mainContext.addTerminatorInstruction(
new LlvmReturn(LlvmTypes.INT_32, new LlvmOperandInt(0))
@@ -104,20 +104,15 @@ public class LlvmCodeGen {
context = argResult.context();
namedArgsByName.put(argName, arg);
}
- var namedArgs = namedArgsByName.entrySet()
- .stream().sorted(Map.Entry.comparingByKey())
- .map(x -> x.getValue())
- .toList();
- var args = new ArrayList<LlvmOperand>();
+ var positionalArgs = new ArrayList<LlvmOperand>();
for (var i = 0; i < call.positionalArgCount(); i++) {
var argResult = context.pop();
var arg = argResult.value();
context = argResult.context();
- args.add(arg);
+ positionalArgs.add(arg);
}
- Collections.reverse(args);
- args.addAll(namedArgs);
+ Collections.reverse(positionalArgs);
var receiverResult = context.pop();
var receiver = receiverResult.value();
@@ -125,8 +120,9 @@ public class LlvmCodeGen {
yield LlvmCodeGenClosures.call(
receiver,
- context,
- args
+ positionalArgs,
+ namedArgsByName,
+ context
);
}
case DefineFunctionInstruction defineFunction -> {
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenClosures.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenClosures.java
index d41298bc..098acbdd 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenClosures.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenClosures.java
@@ -13,6 +13,7 @@ import org.shedlang.compiler.backends.llvm.ir.ast.types.*;
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
import java.util.Optional;
import java.util.function.Function;
@@ -155,8 +156,9 @@ public class LlvmCodeGenClosures {
public static LlvmCodeGenContext call(
LlvmOperand closure,
- LlvmCodeGenContext context,
- List<LlvmOperand> args
+ List<LlvmOperand> positionalArgs,
+ Map<String, LlvmOperand> namedArgsByName,
+ LlvmCodeGenContext context
) {
var closurePointerResult = castValueToClosurePointer(closure, context);
var closurePointer = closurePointerResult.value();
@@ -174,10 +176,15 @@ public class LlvmCodeGenClosures {
var fullArgs = new ArrayList<LlvmTypedOperand>();
fullArgs.add(new LlvmTypedOperand(CALLABLE_TYPES.closurePointer(), closurePointer));
- for (var arg : args) {
+ for (var arg : positionalArgs) {
fullArgs.add(new LlvmTypedOperand(LlvmCodeGenTypes.VALUE_TYPE, arg));
}
+ namedArgsByName.entrySet()
+ .stream().sorted(Map.Entry.comparingByKey())
+ .map(x -> x.getValue())
+ .forEachOrdered(x -> fullArgs.add(new LlvmTypedOperand(LlvmCodeGenTypes.VALUE_TYPE, x)));
+
return context.addInstruction(new LlvmCall(
callTarget,
LlvmCodeGenTypes.VALUE_TYPE,