aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-17 21:17:35 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-17 21:17:35 +0100
commit3c40d3f2134b7cdcc543c76c6d8206a8615fd32b (patch)
tree52f7618a81ea21d4e44e4a4e077ade4e078e6aee /src/main/java
parent770c3ff7989e0e62b4e9bd85bc2db208abd4700a (diff)
Extract storeClosureFreeVariablePointer
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerClosures.java37
1 files changed, 26 insertions, 11 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 8ecedc66..071b60ff 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerClosures.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerClosures.java
@@ -130,24 +130,16 @@ public class LlvmCompilerClosures {
var freeVariableIndex = 0;
for (var freeVariable : freeVariables) {
- var closureEnvironmentPointerResult = getClosureEnvironmentFieldPointer(
+ context = storeClosureFreeVariablePointer(
closurePointer,
freeVariableIndex,
+ freeVariable,
closureTypes,
context
);
- var closureEnvironmentPointer = closureEnvironmentPointerResult.value();
- context = closureEnvironmentPointerResult.context();
-
- context = context.addInstruction(new LlvmStore(
- LlvmCompilerTypes.VALUE_TYPE,
- context.local(freeVariable),
- closureEnvironmentPointer
- ));
freeVariableIndex++;
}
-
var closureValueResult = castClosurePointerToValue(closurePointer, context);
var closureValue = closureValueResult.value();
context = closureValueResult.context();
@@ -293,7 +285,30 @@ public class LlvmCompilerClosures {
return context.toResult(environmentPointer);
}
- private static LlvmCompilerResult<LlvmVariableLocal> getClosureEnvironmentFieldPointer(
+ private static LlvmCompilerContext storeClosureFreeVariablePointer(
+ LlvmOperand closurePointer,
+ int freeVariableIndex,
+ String freeVariable,
+ Types closureTypes,
+ LlvmCompilerContext context
+ ) {
+ var closureEnvironmentPointerResult = getClosureFreeVariablePointer(
+ closurePointer,
+ freeVariableIndex,
+ closureTypes,
+ context
+ );
+ var closureEnvironmentPointer = closureEnvironmentPointerResult.value();
+ context = closureEnvironmentPointerResult.context();
+
+ return context.addInstruction(new LlvmStore(
+ LlvmCompilerTypes.VALUE_TYPE,
+ context.local(freeVariable),
+ closureEnvironmentPointer
+ ));
+ }
+
+ private static LlvmCompilerResult<LlvmVariableLocal> getClosureFreeVariablePointer(
LlvmOperand closurePointer,
int freeVariableIndex,
Types closureTypes,