From 770c3ff7989e0e62b4e9bd85bc2db208abd4700a Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 17 Jun 2023 21:14:26 +0100 Subject: Extract getClosureEnvironmentFieldPointer --- .../backends/llvm/LlvmCompilerClosures.java | 44 +++++++++++++++------- 1 file changed, 31 insertions(+), 13 deletions(-) (limited to 'src') 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 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); + } } -- cgit v1.2.3