diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-10 18:40:52 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-10 18:40:52 +0100 |
| commit | 062175737e6f7f3971075a7446aeae76946b5c9e (patch) | |
| tree | 842624b72556678731493cd2123be79442d76363 /src/main/java | |
| parent | 33cec419ce442aaaf8559abdd5920cd61699104e (diff) | |
Compile namespace to stack instructions
Diffstat (limited to 'src/main/java')
3 files changed, 28 insertions, 1 deletions
diff --git a/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java b/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java index 406da12c..55cd628f 100644 --- a/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java +++ b/src/main/java/org/shedlang/compiler/stackir/StackCompiler.java @@ -91,6 +91,24 @@ public class StackCompiler { return P.vector(new PushIntInstruction(node.value(), node.source())); } + public static PVector<Instruction> compileNamespace(TypedNamespaceNode node) { + var instructions = node.body().stream() + .map(statement -> compileNamespaceStatement(statement)) + .reduce(P.vector(), PVector::plusAll); + + // TODO: handle exports explicitly + for (var statement : node.body()) { + switch (statement) { + case TypedFunctionDefinitionNode functionDefinition -> + instructions = instructions + .plus(new LocalLoadInstruction(functionDefinition.name(), functionDefinition.source())) + .plus(new ModuleExportInstruction(functionDefinition.name(), functionDefinition.source())); + } + } + + return instructions; + } + public static PVector<Instruction> compileNamespaceStatement(TypedNamespaceStatementNode node) { return switch (node) { case TypedFunctionDefinitionNode functionDefinition -> 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 2ff0eebc..0cd97c83 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, PushBoolInstruction, PushIntInstruction, PushStringInstruction { + permits CallInstruction, DefineFunctionInstruction, DiscardInstruction, LocalLoadInstruction, LocalStoreInstruction, ModuleExportInstruction, PushBoolInstruction, PushIntInstruction, PushStringInstruction { 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 new file mode 100644 index 00000000..0f41ba04 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/stackir/instructions/ModuleExportInstruction.java @@ -0,0 +1,9 @@ +package org.shedlang.compiler.stackir.instructions; + +import org.shedlang.compiler.sources.Source; + +public record ModuleExportInstruction( + String name, + Source source +) implements Instruction { +} |
