diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-12-16 12:15:28 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-12-16 12:15:28 +0000 |
| commit | ca1343b24ce610d88fb6f1fd2d858938c14f5f27 (patch) | |
| tree | e7dcd0b0a2a02f5ed71dee0bf74f467875f12f16 /src/main/java | |
| parent | 898d5b2dd44d84f876e2ec0c95f8c35d166a98bd (diff) | |
Extract PatioCodeGenFunctions
Diffstat (limited to 'src/main/java')
5 files changed, 137 insertions, 103 deletions
diff --git a/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java b/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java index 0345a529..0c5db60b 100644 --- a/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java +++ b/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java @@ -254,7 +254,7 @@ public class PatioCodeGen { defineFunction.source(), context ); - case FUNCTION -> PatioCodeGenClosures.create( + case FUNCTION -> PatioCodeGenFunctions.create( target, defineFunction.name(), defineFunction.positionalParams(), diff --git a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenClosures.java b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenClosures.java index c6c19dce..a580b36b 100644 --- a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenClosures.java +++ b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenClosures.java @@ -2,31 +2,31 @@ package org.shedlang.compiler.patio; import org.shedlang.compiler.ast.typed.FreeVariable; import org.shedlang.compiler.ast.typed.FreeVariables; -import org.shedlang.compiler.patio.ast.PatioVisibility; -import org.shedlang.compiler.patio.ast.instructions.*; -import org.shedlang.compiler.patio.ast.operands.PatioFunctionPtr; +import org.shedlang.compiler.patio.ast.instructions.PatioCallPointer; +import org.shedlang.compiler.patio.ast.instructions.PatioIntToDataPtr; +import org.shedlang.compiler.patio.ast.instructions.PatioMemoryLoad; +import org.shedlang.compiler.patio.ast.instructions.PatioMemoryStore; import org.shedlang.compiler.patio.ast.operands.PatioLocalRef; import org.shedlang.compiler.patio.ast.operands.PatioOperand; import org.shedlang.compiler.patio.ast.types.*; -import org.shedlang.compiler.sources.Source; import org.shedlang.compiler.shid.instructions.ShidDefineFunction; +import org.shedlang.compiler.sources.Source; +import org.shedlang.compiler.util.P; import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.function.Function; import java.util.stream.Stream; import static org.shedlang.compiler.util.Iterables.sortedBy; class PatioCodeGenClosures { - private static final PatioType CLOSURE_POINTER_TYPE = PatioTypes.DATA_POINTER; + public static final PatioType CLOSURE_POINTER_TYPE = PatioTypes.DATA_POINTER; public static final PatioType CLOSURE_TYPE = PatioCodeGenTypes.VALUE_TYPE; private PatioCodeGenClosures() {} - private static final List<Integer> FUNCTION_POINTER_OFFSET = List.of(0); - private static final int FREE_VARIABLES_OFFSET = 1; + static final List<Integer> FUNCTION_POINTER_OFFSET = List.of(0); private static PatioDataLayout closureDataLayoutForCall() { return new PatioDataLayoutStruct(List.of( @@ -34,20 +34,22 @@ class PatioCodeGenClosures { )); } - private static PatioDataLayout closureDataLayout( + static PatioDataLayout closureDataLayout( + List<PatioDataLayout> additional, FreeVariables freeVariables, PatioCodeGenContext context ) { - return PatioDataLayouts.struct(List.of( - PatioDataLayouts.FUNCTION_POINTER, - PatioDataLayouts.struct( - freeVariables.stream() - .map(freeVariable -> PatioDataLayouts.fromType( - context.shidLocalType(freeVariable.name()) - )) - .toList() - ) - )); + return PatioDataLayouts.struct( + P.vector(PatioDataLayouts.FUNCTION_POINTER) + .plusAll(additional) + .plus(PatioDataLayouts.struct( + freeVariables.stream() + .map(freeVariable -> PatioDataLayouts.fromType( + context.shidLocalType(freeVariable.name()) + )) + .toList() + )) + ); } private static List<Integer> freeVariableOffset( @@ -57,87 +59,6 @@ class PatioCodeGenClosures { return List.of(freeVariablesOffset, freeVariable.index()); } - public static PatioCodeGenContext create( - PatioLocalRef target, - String name, - List<ShidDefineFunction.Param> positionalParams, - List<ShidDefineFunction.Param> namedParams, - FreeVariables freeVariables, - Function<PatioCodeGenContext, PatioCodeGenContext> generateBody, - Source source, - PatioCodeGenContext context - ) { - var layout = closureDataLayout(freeVariables, context); - - var fullNameResult = context.allocateCompilationUnitElementName( - PatioCodeGenCompilationUnitElementSpace.FUNCTION, - name - ); - var fullName = fullNameResult.value(); - context = fullNameResult.context(); - - var bodyContextParent = context; - context = context.createFunction(fullName, PatioVisibility.PRIVATE, PatioCodeGenTypes.VALUE_TYPE, source, bodyContext -> { - var closurePointerResult = bodyContext.allocateParam( - PatioCodeGenLocalSpace.CLOSURE_POINTER, - CLOSURE_POINTER_TYPE - ); - var closurePointer = closurePointerResult.value(); - bodyContext = closurePointerResult.context(); - - bodyContext = defineParams(positionalParams, namedParams, bodyContext); - - bodyContext = loadFreeVariables( - freeVariables, - closurePointer, - FREE_VARIABLES_OFFSET, - layout, - source, - bodyContext, - bodyContextParent - ); - - bodyContext = generateBody.apply(bodyContext); - - return bodyContext; - }); - - var closurePointerResult = context.allocateVal( - PatioCodeGenLocalSpace.CLOSURE_POINTER, - name, - PatioTypes.DATA_POINTER - ); - var closurePointer = closurePointerResult.value(); - context = closurePointerResult.context(); - - context = PatioCodeGenAlloc.alloc(closurePointer, layout, source, context); - - context = context.addInstruction(new PatioMemoryStore( - closurePointer, - layout, - FUNCTION_POINTER_OFFSET, - new PatioFunctionPtr(fullName), - source - )); - - context = context.addInstruction(new PatioDataPtrToInt( - target, - closurePointer, - source - )); - - context = storeFreeVariables( - freeVariables, - closurePointer, - FREE_VARIABLES_OFFSET, - layout, - source, - context - ); - - return context; - } - static PatioCodeGenContext defineParams( List<ShidDefineFunction.Param> positionalParams, List<ShidDefineFunction.Param> namedParams, diff --git a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenEffects.java b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenEffects.java index 17244e25..a602c50e 100644 --- a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenEffects.java +++ b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenEffects.java @@ -155,7 +155,7 @@ public class PatioCodeGenEffects { .mapToObj(paramIndex -> new ShidDefineFunction.Param("arg" + paramIndex, source)) .toList(); - context = PatioCodeGenClosures.create( + context = PatioCodeGenFunctions.create( effectMethod, method.name(), positionalParams, diff --git a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenFunctions.java b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenFunctions.java new file mode 100644 index 00000000..57cca346 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenFunctions.java @@ -0,0 +1,113 @@ +package org.shedlang.compiler.patio; + +import org.shedlang.compiler.ast.typed.FreeVariables; +import org.shedlang.compiler.patio.ast.PatioVisibility; +import org.shedlang.compiler.patio.ast.instructions.PatioDataPtrToInt; +import org.shedlang.compiler.patio.ast.instructions.PatioMemoryStore; +import org.shedlang.compiler.patio.ast.operands.PatioFunctionPtr; +import org.shedlang.compiler.patio.ast.operands.PatioLocalRef; +import org.shedlang.compiler.patio.ast.types.PatioDataLayout; +import org.shedlang.compiler.patio.ast.types.PatioTypes; +import org.shedlang.compiler.shid.instructions.ShidDefineFunction; +import org.shedlang.compiler.sources.Source; + +import java.util.List; +import java.util.function.Function; + +import static org.shedlang.compiler.patio.PatioCodeGenClosures.*; + +public class PatioCodeGenFunctions { + private PatioCodeGenFunctions() { + } + + // TODO: determine from layout + private static final int FREE_VARIABLES_OFFSET = 1; + + private static PatioDataLayout functionDataLayout( + FreeVariables freeVariables, + PatioCodeGenContext context + ) { + return PatioCodeGenClosures.closureDataLayout(List.of(), freeVariables, context); + } + + public static PatioCodeGenContext create( + PatioLocalRef target, + String name, + List<ShidDefineFunction.Param> positionalParams, + List<ShidDefineFunction.Param> namedParams, + FreeVariables freeVariables, + Function<PatioCodeGenContext, PatioCodeGenContext> generateBody, + Source source, + PatioCodeGenContext context + ) { + var layout = functionDataLayout(freeVariables, context); + + var fullNameResult = context.allocateCompilationUnitElementName( + PatioCodeGenCompilationUnitElementSpace.FUNCTION, + name + ); + var fullName = fullNameResult.value(); + context = fullNameResult.context(); + + var bodyContextParent = context; + context = context.createFunction(fullName, PatioVisibility.PRIVATE, PatioCodeGenTypes.VALUE_TYPE, source, bodyContext -> { + var closurePointerResult = bodyContext.allocateParam( + PatioCodeGenLocalSpace.CLOSURE_POINTER, + PatioCodeGenClosures.CLOSURE_POINTER_TYPE + ); + var closurePointer = closurePointerResult.value(); + bodyContext = closurePointerResult.context(); + + bodyContext = defineParams(positionalParams, namedParams, bodyContext); + + bodyContext = loadFreeVariables( + freeVariables, + closurePointer, + FREE_VARIABLES_OFFSET, + layout, + source, + bodyContext, + bodyContextParent + ); + + bodyContext = generateBody.apply(bodyContext); + + return bodyContext; + }); + + var closurePointerResult = context.allocateVal( + PatioCodeGenLocalSpace.CLOSURE_POINTER, + name, + PatioTypes.DATA_POINTER + ); + var closurePointer = closurePointerResult.value(); + context = closurePointerResult.context(); + + context = PatioCodeGenAlloc.alloc(closurePointer, layout, source, context); + + context = context.addInstruction(new PatioMemoryStore( + closurePointer, + layout, + FUNCTION_POINTER_OFFSET, + new PatioFunctionPtr(fullName), + source + )); + + context = context.addInstruction(new PatioDataPtrToInt( + target, + closurePointer, + source + )); + + context = storeFreeVariables( + freeVariables, + closurePointer, + FREE_VARIABLES_OFFSET, + layout, + source, + context + ); + + return context; + } +} diff --git a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenStructs.java b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenStructs.java index 04aa7be8..7c7ece4d 100644 --- a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenStructs.java +++ b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenStructs.java @@ -27,7 +27,7 @@ public class PatioCodeGenStructs { Source source, PatioCodeGenContext context ) { - return PatioCodeGenClosures.create( + return PatioCodeGenFunctions.create( target, type.name(), List.of(), |
