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