aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-17 21:23:10 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-17 21:23:10 +0100
commit5c81b1b587ce4b65da85c2d5aa11d90ba59bc36e (patch)
tree76b36329a0060056cc6df790fc9d4e5450856c3c /src/main/java
parentd47fd4b64d148fa25682209ccaec1f25a9156620 (diff)
Extract storeClosureFunctionPointer()
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerClosures.java32
1 files changed, 23 insertions, 9 deletions
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerClosures.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerClosures.java
index 21e50495..9ee909bb 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerClosures.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerClosures.java
@@ -109,19 +109,12 @@ public class LlvmCompilerClosures {
)
));
- var closureFunctionPointerPointerResult = getClosureFunctionPointerPointer(
+ context = storeClosureFunctionPointer(
closurePointer,
closureTypes,
+ new LlvmVariableGlobal(topLevelEntityName),
context
);
- var closureFunctionPointerPointer = closureFunctionPointerPointerResult.value();
- context = closureFunctionPointerPointerResult.context();
-
- context = context.addInstruction(new LlvmStore(
- closureTypes.closureFunctionPointer(),
- new LlvmVariableGlobal(topLevelEntityName),
- closureFunctionPointerPointer
- ));
var freeVariableIndex = 0;
for (var freeVariable : freeVariables) {
@@ -219,6 +212,27 @@ public class LlvmCompilerClosures {
return context.toResult(closurePointer);
}
+ private static LlvmCompilerContext storeClosureFunctionPointer(
+ LlvmOperand closurePointer,
+ Types closureTypes,
+ LlvmOperand function,
+ LlvmCompilerContext context
+ ) {
+ var closureFunctionPointerPointerResult = getClosureFunctionPointerPointer(
+ closurePointer,
+ closureTypes,
+ context
+ );
+ var closureFunctionPointerPointer = closureFunctionPointerPointerResult.value();
+ context = closureFunctionPointerPointerResult.context();
+
+ return context.addInstruction(new LlvmStore(
+ closureTypes.closureFunctionPointer(),
+ function,
+ closureFunctionPointerPointer
+ ));
+ }
+
private static LlvmCompilerResult<LlvmVariableLocal> loadClosureFunctionPointer(
LlvmOperand closurePointer,
LlvmCompilerContext context