From 3c40d3f2134b7cdcc543c76c6d8206a8615fd32b Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 17 Jun 2023 21:17:35 +0100 Subject: Extract storeClosureFreeVariablePointer --- .../backends/llvm/LlvmCompilerClosures.java | 37 +++++++++++++++------- 1 file changed, 26 insertions(+), 11 deletions(-) (limited to 'src/main/java') 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 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 getClosureFreeVariablePointer( LlvmOperand closurePointer, int freeVariableIndex, Types closureTypes, -- cgit v1.2.3