aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2025-03-08 13:39:40 +0000
committerMichael Williamson <mike@zwobble.org>2025-03-08 13:39:40 +0000
commit8cfdfc92fcf41f5db6d30015b20457ca64f0c3ce (patch)
tree7dfd0d403b6b8add040eb1e09515194ca6b26065 /src/main/java
parent2462a913d149fe896134519d95d65c3adfa30e47 (diff)
Support method calls from other namespaces (without Wasm support)
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/PatioBackends.java20
-rw-r--r--src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatio.java2
-rw-r--r--src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioContext.java41
-rw-r--r--src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioMethods.java13
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
));