aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-20 17:18:59 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-20 17:18:59 +0100
commitb566789e4dd17ab81fc73917d24cb9bf2a678707 (patch)
treebe94df676a45e4ef375fd533c7505e85c9f12a75 /src/main/java
parent4a6e046a50e68ca90cae7725362e922fd3ca2f58 (diff)
Create data element for namespace value
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/PatioBackend.java4
-rw-r--r--src/main/java/org/shedlang/compiler/patio/PatioCodeGenContext.java51
-rw-r--r--src/main/java/org/shedlang/compiler/patio/PatioCodeGenNamespaces.java26
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/PatioCompilationUnitElement.java2
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/PatioDataElement.java11
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java7
6 files changed, 94 insertions, 7 deletions
diff --git a/src/main/java/org/shedlang/compiler/backends/PatioBackend.java b/src/main/java/org/shedlang/compiler/backends/PatioBackend.java
index 53ab3c6b..bde6f901 100644
--- a/src/main/java/org/shedlang/compiler/backends/PatioBackend.java
+++ b/src/main/java/org/shedlang/compiler/backends/PatioBackend.java
@@ -21,6 +21,8 @@ public class PatioBackend implements Backend {
) {
System.out.println("main: " + config.main());
+ var context = PatioCodeGenContext.forTypeInfo(typeInfo);
+
for (var namespaceEntry : namespaces.entrySet()) {
var namespaceName = namespaceEntry.getKey();
var instructions = namespaceEntry.getValue();
@@ -30,7 +32,7 @@ public class PatioBackend implements Backend {
var compilationUnit = PatioCodeGen.generateNamespace(
namespaceName,
instructions,
- PatioCodeGenContext.EMPTY
+ context
);
var builder = new StringBuilder();
diff --git a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenContext.java b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenContext.java
index e4a21fdf..3b5b3ba1 100644
--- a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenContext.java
+++ b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenContext.java
@@ -8,8 +8,12 @@ import org.shedlang.compiler.backends.llvm.NameAllocator;
import org.shedlang.compiler.patio.ast.*;
import org.shedlang.compiler.patio.ast.instructions.PatioInstruction;
import org.shedlang.compiler.patio.ast.instructions.PatioLocalCopy;
+import org.shedlang.compiler.patio.ast.types.PatioDataLayout;
import org.shedlang.compiler.patio.ast.types.PatioType;
import org.shedlang.compiler.sources.Source;
+import org.shedlang.compiler.typechecker.TypeInfo;
+import org.shedlang.compiler.types.NamespaceName;
+import org.shedlang.compiler.types.NamespaceTypeInfo;
import org.shedlang.compiler.util.P;
import java.util.ArrayList;
@@ -21,14 +25,25 @@ public record PatioCodeGenContext(
FunctionContext functionContext
) {
public record CompilationUnitContext(
+ TypeInfo typeInfo,
OrderedPMap<String, PatioCompilationUnitElement> elementsByName
) {
- public static final CompilationUnitContext EMPTY = new CompilationUnitContext(
- OrderedPMap.empty()
- );
+ public NamespaceTypeInfo namespaceTypeInfo(NamespaceName namespaceName) {
+ return typeInfo.namespaceTypeInfo(namespaceName);
+ }
+
+ public static final CompilationUnitContext EMPTY = forTypeInfo(TypeInfo.EMPTY);
+
+ public static CompilationUnitContext forTypeInfo(TypeInfo typeInfo) {
+ return new CompilationUnitContext(
+ typeInfo,
+ OrderedPMap.empty()
+ );
+ }
public CompilationUnitContext addElement(PatioCompilationUnitElement element) {
return new CompilationUnitContext(
+ this.typeInfo,
this.elementsByName.plus(element.name(), element)
);
}
@@ -50,6 +65,13 @@ public record PatioCodeGenContext(
return toResult(fullName);
}
+ public CompilationUnitContext addDataElement(String name, PatioDataLayout layout, Source source) {
+ return new CompilationUnitContext(
+ this.typeInfo,
+ this.elementsByName.plus(name, new PatioDataElement(name, layout, source))
+ );
+ }
+
public record Result<T>(T value, CompilationUnitContext context) {}
}
@@ -182,6 +204,17 @@ public record PatioCodeGenContext(
FunctionContext.EMPTY
);
+ public static PatioCodeGenContext forTypeInfo(TypeInfo typeInfo) {
+ return new PatioCodeGenContext(
+ CompilationUnitContext.forTypeInfo(typeInfo),
+ FunctionContext.EMPTY
+ );
+ }
+
+ public NamespaceTypeInfo namespaceTypeInfo(NamespaceName namespaceName) {
+ return this.compilationUnitContext.namespaceTypeInfo(namespaceName);
+ }
+
public PatioCodeGenResult<String> allocateCompilationUnitElementName(
PatioCodeGenCompilationUnitElementSpace space,
String name
@@ -194,6 +227,12 @@ public record PatioCodeGenContext(
);
}
+ public PatioCodeGenContext addDataElement(String name, PatioDataLayout layout, Source source) {
+ return withCompilationUnitContext(
+ this.compilationUnitContext.addDataElement(name, layout, source)
+ );
+ }
+
public PatioCodeGenResult<PatioLocalRef> temporaryPop() {
var result = this.functionContext.temporaryPop();
@@ -289,11 +328,15 @@ public record PatioCodeGenContext(
);
}
+ private PatioCodeGenContext withCompilationUnitContext(CompilationUnitContext compilationUnitContext) {
+ return new PatioCodeGenContext(compilationUnitContext, this.functionContext);
+ }
+
private <T> PatioCodeGenResult<T> withCompilationUnitContextResult(CompilationUnitContext.Result<T> result) {
return new PatioCodeGenContext(result.context, this.functionContext).toResult(result.value);
}
- private <T> PatioCodeGenContext withFunctionContext(FunctionContext functionContext) {
+ private PatioCodeGenContext withFunctionContext(FunctionContext functionContext) {
return new PatioCodeGenContext(this.compilationUnitContext, functionContext);
}
diff --git a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenNamespaces.java b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenNamespaces.java
index 3e87058d..a07bb1f2 100644
--- a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenNamespaces.java
+++ b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenNamespaces.java
@@ -1,8 +1,11 @@
package org.shedlang.compiler.patio;
+import org.shedlang.compiler.patio.ast.types.PatioDataLayout;
import org.shedlang.compiler.patio.ast.types.PatioTypes;
import org.shedlang.compiler.sources.Sources;
import org.shedlang.compiler.types.NamespaceName;
+import org.shedlang.compiler.types.NamespaceTypeInfo;
+import org.shedlang.compiler.util.Lists;
import java.util.function.Function;
@@ -14,11 +17,23 @@ public class PatioCodeGenNamespaces {
Function<PatioCodeGenContext, PatioCodeGenContext> generateInitBody,
PatioCodeGenContext context
) {
+ // TODO: proper source
+ var source = Sources.NULL;
+
+ var namespaceTypeInfo = context.namespaceTypeInfo(namespaceName);
+ var layout = namespaceDataLayout(namespaceTypeInfo);
+
+ context = context.addDataElement(
+ globalNameNamespaceValue(namespaceName),
+ layout,
+ source
+ );
+
context = context.createFunction(
globalNameNamespaceInit(namespaceName),
false,
PatioTypes.VOID,
- Sources.NULL,
+ source,
initContext ->
generateInitBody.apply(initContext)
);
@@ -26,6 +41,15 @@ public class PatioCodeGenNamespaces {
return context;
}
+ private static PatioDataLayout namespaceDataLayout(NamespaceTypeInfo namespaceTypeInfo) {
+ return PatioTypes.structFlat(
+ Lists.repeat(
+ PatioCodeGenTypes.VALUE_TYPE,
+ namespaceTypeInfo.fieldCount()
+ )
+ );
+ }
+
// TODO: allocate names through context
private static String globalNameNamespaceValue(NamespaceName namespaceName) {
return "shed__namespace__" + namespaceNameToPatioIdentifier(namespaceName);
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/PatioCompilationUnitElement.java b/src/main/java/org/shedlang/compiler/patio/ast/PatioCompilationUnitElement.java
index eecdd3c2..d4ad4715 100644
--- a/src/main/java/org/shedlang/compiler/patio/ast/PatioCompilationUnitElement.java
+++ b/src/main/java/org/shedlang/compiler/patio/ast/PatioCompilationUnitElement.java
@@ -2,7 +2,7 @@ package org.shedlang.compiler.patio.ast;
import org.shedlang.compiler.sources.Source;
-public sealed interface PatioCompilationUnitElement permits PatioFunctionDefinition {
+public sealed interface PatioCompilationUnitElement permits PatioDataElement, PatioFunctionDefinition {
String name();
Source source();
}
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/PatioDataElement.java b/src/main/java/org/shedlang/compiler/patio/ast/PatioDataElement.java
new file mode 100644
index 00000000..7be5dfd3
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/patio/ast/PatioDataElement.java
@@ -0,0 +1,11 @@
+package org.shedlang.compiler.patio.ast;
+
+import org.shedlang.compiler.patio.ast.types.PatioDataLayout;
+import org.shedlang.compiler.sources.Source;
+
+public record PatioDataElement(
+ String name,
+ PatioDataLayout layout,
+ Source source
+) implements PatioCompilationUnitElement {
+}
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java b/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java
index ecaddef8..3b7e6a7b 100644
--- a/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java
+++ b/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java
@@ -66,6 +66,13 @@ public class PatioSerializer {
private static Tree compilationUnitElementToTree(PatioCompilationUnitElement element) {
return switch (element) {
+ case PatioDataElement dataElement ->
+ treeList(
+ treeIdentifier("data"),
+ treeString(dataElement.name()),
+ dataLayoutToTree(dataElement.layout())
+ );
+
case PatioFunctionDefinition functionDefinition ->
treeListIndented(
treeIdentifier("function"),