aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2024-01-24 19:46:28 +0000
committerMichael Williamson <mike@zwobble.org>2024-01-24 19:46:28 +0000
commit10aee360aeca39d6f605394762f5d732b9688315 (patch)
treee01fec6c51de140eb2e13abd0050c204c1f701f6 /src/main/java
parent7a83b6e88268277871788a3d8d86a3b8e044b142 (diff)
Reuse Shid-to-Patio contexts
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/PatioTextBackend.java4
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java35
-rw-r--r--src/main/java/org/shedlang/compiler/backends/wasm/WasmBackend.java25
-rw-r--r--src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatio.java2
-rw-r--r--src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioContext.java15
5 files changed, 52 insertions, 29 deletions
diff --git a/src/main/java/org/shedlang/compiler/backends/PatioTextBackend.java b/src/main/java/org/shedlang/compiler/backends/PatioTextBackend.java
index 0b4c5198..a68f9303 100644
--- a/src/main/java/org/shedlang/compiler/backends/PatioTextBackend.java
+++ b/src/main/java/org/shedlang/compiler/backends/PatioTextBackend.java
@@ -27,10 +27,12 @@ public class PatioTextBackend implements Backend {
var context = ShidToPatioContext.forTypeInfos(typeInfos);
for (var namespace : namespaces) {
- var compilationUnit = ShidToPatio.generateNamespace(
+ var compilationUnitResult = ShidToPatio.generateNamespace(
namespace,
context
);
+ var compilationUnit = compilationUnitResult.value();
+ context = compilationUnitResult.context();
var builder = new StringBuilder();
PatioSerializer.serializeCompilationUnit(compilationUnit, builder);
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java
index 4a74b6d9..027fc4b9 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java
@@ -60,20 +60,23 @@ public class LlvmBackend implements Backend {
var llvmCompiler = LlvmCompiler.forTarget(this.target);
var objectFilePaths = new ArrayList<Path>();
- var globalContext = PatioToLlvmGlobalContext.empty(this.target);
+ var shidToPatioContext = ShidToPatioContext.forTypeInfos(typeInfos);
+ var patioToLlvmGlobalContext = PatioToLlvmGlobalContext.empty(this.target);
for (var namespace : namespaces) {
- var patioCompilationUnit = ShidToPatio.generateNamespace(
+ var patioCompilationUnitResult = ShidToPatio.generateNamespace(
namespace,
- ShidToPatioContext.forTypeInfos(typeInfos)
+ shidToPatioContext
);
+ var patioCompilationUnit = patioCompilationUnitResult.value();
+ shidToPatioContext = patioCompilationUnitResult.context();
var llvmModuleResult = PatioToLlvm.generateCompilationUnit(
patioCompilationUnit,
- globalContext
+ patioToLlvmGlobalContext
);
var llvmModule = llvmModuleResult.value();
- globalContext = llvmModuleResult.context();
+ patioToLlvmGlobalContext = llvmModuleResult.context();
var objectPath = llvmCompiler.compileLlvmModule(
llvmModule,
@@ -86,7 +89,11 @@ public class LlvmBackend implements Backend {
for (var bin : config.bins()) {
var linkInputs = new ArrayList<>(objectFilePaths);
- var mainModule = this.generateMain(bin.mainNamespace(), typeInfos, globalContext);
+ var mainModule = this.generateMain(
+ bin.mainNamespace(),
+ shidToPatioContext,
+ patioToLlvmGlobalContext
+ );
var mainObjectPath = llvmCompiler.compileLlvmModule(mainModule, targetDir.bin(bin.name()));
linkInputs.add(mainObjectPath);
@@ -120,23 +127,23 @@ public class LlvmBackend implements Backend {
private LlvmModule generateMain(
NamespaceName main,
- TypeInfos typeInfos,
- PatioToLlvmGlobalContext globalContext
+ ShidToPatioContext shidToPatioContext,
+ PatioToLlvmGlobalContext patioToLlvmGlobalContext
) {
// TODO: use more appropriate source
var source = Sources.NULL;
- var context = ShidToPatioContext.forTypeInfos(typeInfos);
-
- var generateMainResult = ShidToPatio.generateMain(main, source, context);
+ var generateMainResult = ShidToPatio.generateMain(main, source, shidToPatioContext);
var mainFunctionName = generateMainResult.value();
- context = generateMainResult.context();
+ shidToPatioContext = generateMainResult.context();
- var patioCompilationUnit = context.toCompilationUnit(source);
+ var patioCompilationUnitResult = shidToPatioContext.toCompilationUnit(source);
+ var patioCompilationUnit = patioCompilationUnitResult.value();
+ shidToPatioContext = patioCompilationUnitResult.context();
var llvmModuleResult = PatioToLlvm.generateCompilationUnit(
patioCompilationUnit,
- globalContext
+ patioToLlvmGlobalContext
);
var llvmModule = llvmModuleResult.value();
diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/WasmBackend.java b/src/main/java/org/shedlang/compiler/backends/wasm/WasmBackend.java
index 9cdbee8c..d6392ab3 100644
--- a/src/main/java/org/shedlang/compiler/backends/wasm/WasmBackend.java
+++ b/src/main/java/org/shedlang/compiler/backends/wasm/WasmBackend.java
@@ -57,11 +57,15 @@ public class WasmBackend implements Backend {
TargetDir targetDir
) throws IOException, InterruptedException {
var objectFilePaths = new ArrayList<Path>();
+ var shidToPatioContext = ShidToPatioContext.forTypeInfos(typeInfos);
+
for (var namespace : namespaces) {
- var patioCompilationUnit = ShidToPatio.generateNamespace(
+ var patioCompilationUnitResult = ShidToPatio.generateNamespace(
namespace,
- ShidToPatioContext.forTypeInfos(typeInfos)
+ shidToPatioContext
);
+ var patioCompilationUnit = patioCompilationUnitResult.value();
+ shidToPatioContext = patioCompilationUnitResult.context();
var wasmModule = PatioToWasm.generateCompilationUnit(
patioCompilationUnit,
@@ -78,7 +82,7 @@ public class WasmBackend implements Backend {
for (var bin : config.bins()) {
var linkInputs = new ArrayList<>(objectFilePaths);
- var mainModule = this.generateMain(bin.mainNamespace(), typeInfos);
+ var mainModule = this.generateMain(bin.mainNamespace(), shidToPatioContext);
var mainObjectPath = writeObjectFile(mainModule, targetDir.bin(bin.name()));
linkInputs.add(mainObjectPath);
@@ -110,17 +114,20 @@ public class WasmBackend implements Backend {
runInheritIo(ldArgs);
}
- private WasmModule generateMain(NamespaceName main, TypeInfos typeInfos) {
+ private WasmModule generateMain(
+ NamespaceName main,
+ ShidToPatioContext shidToPatioContext
+ ) {
// TODO: set appropriate source
var source = Sources.NULL;
- var context = ShidToPatioContext.forTypeInfos(typeInfos);
-
- var generateMainResult = ShidToPatio.generateMain(main, source, context);
+ var generateMainResult = ShidToPatio.generateMain(main, source, shidToPatioContext);
var mainFunctionName = generateMainResult.value();
- context = generateMainResult.context();
+ shidToPatioContext = generateMainResult.context();
- var patioCompilationUnit = context.toCompilationUnit(source);
+ var patioCompilationUnitResult = shidToPatioContext.toCompilationUnit(source);
+ var patioCompilationUnit = patioCompilationUnitResult.value();
+ shidToPatioContext = patioCompilationUnitResult.context();
var wasmModule = PatioToWasm.generateCompilationUnit(
patioCompilationUnit,
diff --git a/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatio.java b/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatio.java
index b83fc428..90d22d3b 100644
--- a/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatio.java
+++ b/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatio.java
@@ -100,7 +100,7 @@ public class ShidToPatio {
return context.toResult(mainFunctionName);
}
- public static PatioCompilationUnit generateNamespace(
+ public static ShidToPatioResult<PatioCompilationUnit> generateNamespace(
ShidNamespace shidNamespace,
ShidToPatioContext context
) {
diff --git a/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioContext.java b/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioContext.java
index c93dad28..abfb7a72 100644
--- a/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioContext.java
+++ b/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioContext.java
@@ -473,8 +473,15 @@ public record ShidToPatioContext(
@CheckReturnValue
public static ShidToPatioContext forTypeInfos(TypeInfos typeInfos) {
+ return initialForCompilationUnit(
+ GlobalContext.forTypeInfos(typeInfos)
+ );
+ }
+
+ @CheckReturnValue
+ private static ShidToPatioContext initialForCompilationUnit(GlobalContext globalContext) {
return new ShidToPatioContext(
- GlobalContext.forTypeInfos(typeInfos),
+ globalContext,
CompilationUnitContext.EMPTY,
P.stack(),
FunctionContext.EMPTY
@@ -858,10 +865,10 @@ public record ShidToPatioContext(
}
@CheckReturnValue
- public PatioCompilationUnit toCompilationUnit(Source source) {
- return new PatioCompilationUnit(
+ public ShidToPatioResult<PatioCompilationUnit> toCompilationUnit(Source source) {
+ return initialForCompilationUnit(this.globalContext).toResult(new PatioCompilationUnit(
new ArrayList<>(this.compilationUnitContext.elementsByName.values()),
source
- );
+ ));
}
}