diff options
| author | Michael Williamson <mike@zwobble.org> | 2024-01-24 19:46:28 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2024-01-24 19:46:28 +0000 |
| commit | 10aee360aeca39d6f605394762f5d732b9688315 (patch) | |
| tree | e01fec6c51de140eb2e13abd0050c204c1f701f6 /src/main/java | |
| parent | 7a83b6e88268277871788a3d8d86a3b8e044b142 (diff) | |
Reuse Shid-to-Patio contexts
Diffstat (limited to 'src/main/java')
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 - ); + )); } } |
