diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-12 23:16:32 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-12 23:16:32 +0100 |
| commit | 8a0ba886b0818a289d2990732ebf7769a013e7f0 (patch) | |
| tree | 30a47cadb5f99c18e71145ef06f07b23870311f0 /src/main/java | |
| parent | 339a9ae71595b0d6e0cdcc86495061e65859033c (diff) | |
Replace module-export instruction with namespace-field-store
Diffstat (limited to 'src/main/java')
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 { +} |
