diff options
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerClosures.java | 37 |
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, |
