aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerClosures.java44
1 files changed, 31 insertions, 13 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 26674a40..8ecedc66 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerClosures.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerClosures.java
@@ -130,23 +130,15 @@ public class LlvmCompilerClosures {
var freeVariableIndex = 0;
for (var freeVariable : freeVariables) {
- var closureEnvironmentPointerResult = context.generateVariableLocal(
- LlvmCompilerLocalVariableSpace.CLOSURE_ENVIRONMENT_POINTER
+ var closureEnvironmentPointerResult = getClosureEnvironmentFieldPointer(
+ closurePointer,
+ freeVariableIndex,
+ closureTypes,
+ context
);
var closureEnvironmentPointer = closureEnvironmentPointerResult.value();
context = closureEnvironmentPointerResult.context();
- context = context.addInstruction(new LlvmGetElementPtr(
- closureEnvironmentPointer,
- closureTypes.closurePointer(),
- closurePointer,
- List.of(
- LlvmTypedOperand.arrayIndex(0),
- LlvmTypedOperand.structureIndex(1),
- LlvmTypedOperand.arrayIndex(freeVariableIndex)
- )
- ));
-
context = context.addInstruction(new LlvmStore(
LlvmCompilerTypes.VALUE_TYPE,
context.local(freeVariable),
@@ -300,4 +292,30 @@ public class LlvmCompilerClosures {
return context.toResult(environmentPointer);
}
+
+ private static LlvmCompilerResult<LlvmVariableLocal> getClosureEnvironmentFieldPointer(
+ LlvmOperand closurePointer,
+ int freeVariableIndex,
+ Types closureTypes,
+ LlvmCompilerContext context
+ ) {
+ var closureEnvironmentPointerResult = context.generateVariableLocal(
+ LlvmCompilerLocalVariableSpace.CLOSURE_ENVIRONMENT_POINTER
+ );
+ var closureEnvironmentPointer = closureEnvironmentPointerResult.value();
+ context = closureEnvironmentPointerResult.context();
+
+ context = context.addInstruction(new LlvmGetElementPtr(
+ closureEnvironmentPointer,
+ closureTypes.closurePointer(),
+ closurePointer,
+ List.of(
+ LlvmTypedOperand.arrayIndex(0),
+ LlvmTypedOperand.structureIndex(1),
+ LlvmTypedOperand.arrayIndex(freeVariableIndex)
+ )
+ ));
+
+ return context.toResult(closureEnvironmentPointer);
+ }
}