diff options
| author | Michael Williamson <mike@zwobble.org> | 2025-03-08 13:39:40 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2025-03-08 13:39:40 +0000 |
| commit | 8cfdfc92fcf41f5db6d30015b20457ca64f0c3ce (patch) | |
| tree | 7dfd0d403b6b8add040eb1e09515194ca6b26065 /src/main/java | |
| parent | 2462a913d149fe896134519d95d65c3adfa30e47 (diff) | |
Support method calls from other namespaces (without Wasm support)
Diffstat (limited to 'src/main/java')
4 files changed, 57 insertions, 19 deletions
diff --git a/src/main/java/org/shedlang/compiler/backends/PatioBackends.java b/src/main/java/org/shedlang/compiler/backends/PatioBackends.java index bc90c6b4..b8f93ca3 100644 --- a/src/main/java/org/shedlang/compiler/backends/PatioBackends.java +++ b/src/main/java/org/shedlang/compiler/backends/PatioBackends.java @@ -13,6 +13,7 @@ import org.shedlang.compiler.types.NamespaceName; import java.io.IOException; import java.util.List; +import java.util.Optional; public class PatioBackends { public interface PatioToTarget { @@ -36,30 +37,39 @@ public class PatioBackends { TypeInfos typeInfos, PatioToTarget patioToTarget ) throws IOException, InterruptedException { - var shidToPatioContext = ShidToPatioContext.forTypeInfos(typeInfos); + var shidToPatioGlobalContext = ShidToPatioContext.GlobalContext.forTypeInfos(typeInfos); for (var namespace : namespaces) { + var shidToPatioContext = ShidToPatioContext.initialForCompilationUnit( + Optional.of(namespace.namespaceName()), + shidToPatioGlobalContext + ); var patioCompilationUnitResult = ShidToPatio.generateNamespace( namespace, shidToPatioContext ); var patioCompilationUnit = patioCompilationUnitResult.value(); - shidToPatioContext = patioCompilationUnitResult.context(); + shidToPatioGlobalContext = patioCompilationUnitResult.context(); patioToTarget = patioToTarget.namespace(namespace.namespaceName(), patioCompilationUnit); } for (var bin : config.bins()) { - generateMain(profileConfig, bin, shidToPatioContext, patioToTarget); + generateMain(profileConfig, bin, shidToPatioGlobalContext, patioToTarget); } } private static void generateMain( ProfileConfig profileConfig, BinConfig binConfig, - ShidToPatioContext shidToPatioContext, + ShidToPatioContext.GlobalContext shidToPatioGlobalContext, PatioToTarget patioToTarget ) throws IOException, InterruptedException { + var shidToPatioContext = ShidToPatioContext.initialForCompilationUnit( + Optional.empty(), + shidToPatioGlobalContext + ); + // TODO: set appropriate source var source = Sources.NULL; @@ -78,7 +88,7 @@ public class PatioBackends { var patioCompilationUnitResult = shidToPatioContext.toCompilationUnit(source); var patioCompilationUnit = patioCompilationUnitResult.value(); - shidToPatioContext = patioCompilationUnitResult.context(); + shidToPatioGlobalContext = patioCompilationUnitResult.context(); patioToTarget.bin( binConfig.name(), diff --git a/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatio.java b/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatio.java index a27168c4..97f5d4cd 100644 --- a/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatio.java +++ b/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatio.java @@ -108,7 +108,7 @@ public class ShidToPatio { return context.toResult(mainFunctionName); } - public static ShidToPatioResult<PatioCompilationUnit> generateNamespace( + public static ShidToPatioContext.GlobalContext.Result<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 ac8f0094..397ce996 100644 --- a/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioContext.java +++ b/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioContext.java @@ -172,14 +172,28 @@ public record ShidToPatioContext( } public record CompilationUnitContext( + Optional<NamespaceName> namespaceName, OrderedPMap<String, PatioCompilationUnitElement> elementsByName ) { - public static CompilationUnitContext EMPTY = new CompilationUnitContext(OrderedPMap.empty()); + public static CompilationUnitContext EMPTY = initial(Optional.empty()); + + public static CompilationUnitContext initial(Optional<NamespaceName> namespaceName) { + return new CompilationUnitContext( + namespaceName, + OrderedPMap.empty() + ); + } + + @CheckReturnValue + public Optional<NamespaceName> namespaceName() { + return this.namespaceName; + } @CheckReturnValue public CompilationUnitContext addElement(PatioCompilationUnitElement element) { // TODO: handle existing element with name. return new CompilationUnitContext( + this.namespaceName, this.elementsByName.plus(element.name(), element) ); } @@ -212,6 +226,7 @@ public record ShidToPatioContext( } return new CompilationUnitContext( + this.namespaceName, this.elementsByName.plus(element.name(), element) ); } @@ -224,6 +239,7 @@ public record ShidToPatioContext( if (existingElement == null) { return new CompilationUnitContext( + this.namespaceName, this.elementsByName.plus(element.name(), element) ); } else if (existingElement.equals(element)) { @@ -528,17 +544,13 @@ public record ShidToPatioContext( ); @CheckReturnValue - public static ShidToPatioContext forTypeInfos(TypeInfos typeInfos) { - return initialForCompilationUnit( - GlobalContext.forTypeInfos(typeInfos) - ); - } - - @CheckReturnValue - private static ShidToPatioContext initialForCompilationUnit(GlobalContext globalContext) { + public static ShidToPatioContext initialForCompilationUnit( + Optional<NamespaceName> namespaceName, + GlobalContext globalContext + ) { return new ShidToPatioContext( globalContext, - CompilationUnitContext.EMPTY, + CompilationUnitContext.initial(namespaceName), P.stack(), FunctionContext.EMPTY ); @@ -580,6 +592,11 @@ public record ShidToPatioContext( } @CheckReturnValue + public Optional<NamespaceName> namespaceName() { + return this.compilationUnitContext.namespaceName(); + } + + @CheckReturnValue public ShidToPatioResult<String> allocateCompilationUnitElementName( ShidToPatioCompilationUnitElementSpace space, String name @@ -957,8 +974,8 @@ public record ShidToPatioContext( } @CheckReturnValue - public ShidToPatioResult<PatioCompilationUnit> toCompilationUnit(Source source) { - return initialForCompilationUnit(this.globalContext).toResult(new PatioCompilationUnit( + public GlobalContext.Result<PatioCompilationUnit> toCompilationUnit(Source source) { + return this.globalContext.toResult(new PatioCompilationUnit( new ArrayList<>(this.compilationUnitContext.elementsByName.values()), source )); diff --git a/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioMethods.java b/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioMethods.java index 96f3a83c..6dfaf6a4 100644 --- a/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioMethods.java +++ b/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioMethods.java @@ -1,5 +1,6 @@ package org.shedlang.compiler.shidtopatio; +import org.shedlang.compiler.patio.PatioDataElementMutableDeclaration; import org.shedlang.compiler.patio.PatioDataElementMutableDefinition; import org.shedlang.compiler.patio.PatioVisibility; import org.shedlang.compiler.patio.instructions.PatioMemoryLoad; @@ -10,10 +11,12 @@ import org.shedlang.compiler.patio.operands.PatioOperand; import org.shedlang.compiler.patio.types.PatioDataLayouts; import org.shedlang.compiler.patio.types.PatioDataValues; import org.shedlang.compiler.sources.Source; +import org.shedlang.compiler.sources.Sources; import org.shedlang.compiler.types.SimpleConcreteType; import java.text.MessageFormat; import java.util.List; +import java.util.Optional; import static org.shedlang.compiler.shidtopatio.ShidToPatioNamespaces.namespaceNameToPatioIdentifier; @@ -28,6 +31,14 @@ public class ShidToPatioMethods { Source source, ShidToPatioContext context ) { + if (!context.namespaceName().equals(Optional.of(type.namespaceName()))) { + context = context.ensureCompilationUnitElement(new PatioDataElementMutableDeclaration( + globalNameMethod(type, methodName), + PatioDataLayouts.fromType(ShidToPatioTypes.VALUE_TYPE), + Sources.NULL + )); + } + context = context.addInstruction(new PatioMemoryLoad( destination, globalOperandMethod(type, methodName), @@ -48,7 +59,7 @@ public class ShidToPatioMethods { ) { context = context.addCompilationUnitElement(new PatioDataElementMutableDefinition( globalNameMethod(type, methodName), - PatioVisibility.PRIVATE, + PatioVisibility.PUBLIC, PatioDataValues.int_(0), source )); |
