diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-07-20 17:18:59 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-07-20 17:18:59 +0100 |
| commit | b566789e4dd17ab81fc73917d24cb9bf2a678707 (patch) | |
| tree | be94df676a45e4ef375fd533c7505e85c9f12a75 /src/main/java | |
| parent | 4a6e046a50e68ca90cae7725362e922fd3ca2f58 (diff) | |
Create data element for namespace value
Diffstat (limited to 'src/main/java')
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"), |
