diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-17 21:14:26 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-17 21:14:26 +0100 |
| commit | 770c3ff7989e0e62b4e9bd85bc2db208abd4700a (patch) | |
| tree | 02fdaad72844c60761b6e2286a25a267b2e999ef /src/main/java | |
| parent | 8c0463d87b84966aef30d1a3a104a4c4fa916cd7 (diff) | |
Extract getClosureEnvironmentFieldPointer
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerClosures.java | 44 |
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); + } } |
