aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-12-16 12:15:28 +0000
committerMichael Williamson <mike@zwobble.org>2023-12-16 12:15:28 +0000
commitca1343b24ce610d88fb6f1fd2d858938c14f5f27 (patch)
treee7dcd0b0a2a02f5ed71dee0bf74f467875f12f16 /src/main/java
parent898d5b2dd44d84f876e2ec0c95f8c35d166a98bd (diff)
Extract PatioCodeGenFunctions
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java2
-rw-r--r--src/main/java/org/shedlang/compiler/patio/PatioCodeGenClosures.java121
-rw-r--r--src/main/java/org/shedlang/compiler/patio/PatioCodeGenEffects.java2
-rw-r--r--src/main/java/org/shedlang/compiler/patio/PatioCodeGenFunctions.java113
-rw-r--r--src/main/java/org/shedlang/compiler/patio/PatioCodeGenStructs.java2
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(),