aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-12 23:16:32 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-12 23:16:32 +0100
commit8a0ba886b0818a289d2990732ebf7769a013e7f0 (patch)
tree30a47cadb5f99c18e71145ef06f07b23870311f0 /src/main/java
parent339a9ae71595b0d6e0cdcc86495061e65859033c (diff)
Replace module-export instruction with namespace-field-store
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ShedCompiler.java2
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java2
-rw-r--r--src/main/java/org/shedlang/compiler/stackir/InstructionSerializer.java7
-rw-r--r--src/main/java/org/shedlang/compiler/stackir/StackCompiler.java9
-rw-r--r--src/main/java/org/shedlang/compiler/stackir/instructions/Instruction.java2
-rw-r--r--src/main/java/org/shedlang/compiler/stackir/instructions/ModuleExportInstruction.java9
-rw-r--r--src/main/java/org/shedlang/compiler/stackir/instructions/NamespaceFieldStore.java15
7 files changed, 29 insertions, 17 deletions
diff --git a/src/main/java/org/shedlang/compiler/ShedCompiler.java b/src/main/java/org/shedlang/compiler/ShedCompiler.java
index 8cc102d8..932ca148 100644
--- a/src/main/java/org/shedlang/compiler/ShedCompiler.java
+++ b/src/main/java/org/shedlang/compiler/ShedCompiler.java
@@ -65,7 +65,7 @@ public class ShedCompiler {
));
var typedNode = TypeChecker.typeCheckNamespace(untypedNode, context);
- var instructions = StackCompiler.compileNamespace(typedNode);
+ var instructions = StackCompiler.compileNamespace(typedNode, namespaceName);
namespaces.put(namespaceName, instructions);
}
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java
index db7ffd13..656193a3 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java
@@ -33,7 +33,7 @@ public class LlvmCompiler {
yield context.addLocal(localStore.name(), value);
}
- case ModuleExportInstruction moduleExportInstruction -> {
+ case NamespaceFieldStore namespaceFieldStore -> {
throw new UnsupportedOperationException("TODO");
}
case PushBoolInstruction pushBool ->
diff --git a/src/main/java/org/shedlang/compiler/stackir/InstructionSerializer.java b/src/main/java/org/shedlang/compiler/stackir/InstructionSerializer.java
index 70959410..33d3dd32 100644
--- a/src/main/java/org/shedlang/compiler/stackir/InstructionSerializer.java
+++ b/src/main/java/org/shedlang/compiler/stackir/InstructionSerializer.java
@@ -86,10 +86,11 @@ public class InstructionSerializer {
treeString(localStoreInstruction.name())
);
- case ModuleExportInstruction moduleExportInstruction ->
+ case NamespaceFieldStore namespaceFieldStore ->
treeList(
- treeIdentifier("module-export"),
- treeString(moduleExportInstruction.name())
+ treeIdentifier("namespace-field-store"),
+ treeString(namespaceFieldStore.namespaceName().toString()),
+ treeString(namespaceFieldStore.fieldName())
);
case PushBoolInstruction pushBoolInstruction ->
diff --git a/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java b/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java
index ff9b7de2..e5728ca3 100644
--- a/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java
+++ b/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java
@@ -3,6 +3,7 @@ package org.shedlang.compiler.stackir;
import org.pcollections.PVector;
import org.shedlang.compiler.ast.typed.*;
import org.shedlang.compiler.stackir.instructions.*;
+import org.shedlang.compiler.types.NamespaceName;
import org.shedlang.compiler.util.P;
import java.util.stream.Collectors;
@@ -102,7 +103,7 @@ public class StackCompiler {
return P.vector(new PushIntInstruction(node.value(), node.source()));
}
- public static PVector<Instruction> compileNamespace(TypedNamespaceNode node) {
+ public static PVector<Instruction> compileNamespace(TypedNamespaceNode node, NamespaceName namespaceName) {
var instructions = node.body().stream()
.map(statement -> compileNamespaceStatement(statement))
.reduce(P.vector(), PVector::plusAll);
@@ -113,7 +114,11 @@ public class StackCompiler {
case TypedFunctionDefinitionNode functionDefinition ->
instructions = instructions
.plus(new LocalLoadInstruction(functionDefinition.name(), functionDefinition.source()))
- .plus(new ModuleExportInstruction(functionDefinition.name(), functionDefinition.source()));
+ .plus(new NamespaceFieldStore(
+ namespaceName,
+ functionDefinition.name(),
+ functionDefinition.source()
+ ));
}
}
diff --git a/src/main/java/org/shedlang/compiler/stackir/instructions/Instruction.java b/src/main/java/org/shedlang/compiler/stackir/instructions/Instruction.java
index fde83eed..c3357c06 100644
--- a/src/main/java/org/shedlang/compiler/stackir/instructions/Instruction.java
+++ b/src/main/java/org/shedlang/compiler/stackir/instructions/Instruction.java
@@ -3,7 +3,7 @@ package org.shedlang.compiler.stackir.instructions;
import org.shedlang.compiler.sources.Source;
public sealed interface Instruction
- permits CallInstruction, DefineFunctionInstruction, DiscardInstruction, LocalLoadInstruction, LocalStoreInstruction, ModuleExportInstruction, PushBoolInstruction, PushIntInstruction, PushStringInstruction, PushUnitInstruction {
+ permits CallInstruction, DefineFunctionInstruction, DiscardInstruction, LocalLoadInstruction, LocalStoreInstruction, NamespaceFieldStore, PushBoolInstruction, PushIntInstruction, PushStringInstruction, PushUnitInstruction {
Source source();
}
diff --git a/src/main/java/org/shedlang/compiler/stackir/instructions/ModuleExportInstruction.java b/src/main/java/org/shedlang/compiler/stackir/instructions/ModuleExportInstruction.java
deleted file mode 100644
index 0f41ba04..00000000
--- a/src/main/java/org/shedlang/compiler/stackir/instructions/ModuleExportInstruction.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package org.shedlang.compiler.stackir.instructions;
-
-import org.shedlang.compiler.sources.Source;
-
-public record ModuleExportInstruction(
- String name,
- Source source
-) implements Instruction {
-}
diff --git a/src/main/java/org/shedlang/compiler/stackir/instructions/NamespaceFieldStore.java b/src/main/java/org/shedlang/compiler/stackir/instructions/NamespaceFieldStore.java
new file mode 100644
index 00000000..9a818708
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/stackir/instructions/NamespaceFieldStore.java
@@ -0,0 +1,15 @@
+package org.shedlang.compiler.stackir.instructions;
+
+import org.shedlang.compiler.sources.Source;
+import org.shedlang.compiler.types.NamespaceName;
+
+/**
+ * Pop a value from the stack and store it as the field with the given name on
+ * the given namespace.
+ */
+public record NamespaceFieldStore(
+ NamespaceName namespaceName,
+ String fieldName,
+ Source source
+) implements Instruction {
+}