From 52ea9be878308da4113abcd14b70ba4b39503ef6 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 30 Jun 2023 19:12:25 +0100 Subject: Add namespace-import instruction --- .../java/org/shedlang/compiler/backends/llvm/LlvmCodeGen.java | 11 +++++++++++ .../java/org/shedlang/compiler/backends/wasm/WasmCodeGen.java | 4 ++++ .../org/shedlang/compiler/stackir/InstructionSerializer.java | 6 ++++++ .../shedlang/compiler/stackir/instructions/Instruction.java | 2 +- .../stackir/instructions/NamespaceImportInstruction.java | 10 ++++++++++ 5 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/shedlang/compiler/stackir/instructions/NamespaceImportInstruction.java (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGen.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGen.java index 179e6cf6..cd302929 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGen.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGen.java @@ -160,6 +160,17 @@ public class LlvmCodeGen { ); } + case NamespaceImportInstruction namespaceImport -> { + var importValueResult = LlvmCodeGenNamespaces.importValue( + namespaceImport.namespaceName(), + context + ); + var importValue = importValueResult.value(); + context = importValueResult.context(); + + yield context.push(importValue); + } + case PushBoolInstruction pushBool -> context.push(new LlvmOperandInt(pushBool.value() ? 1 : 0)); diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGen.java b/src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGen.java index 64835427..71043f81 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGen.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGen.java @@ -191,6 +191,10 @@ public class WasmCodeGen { context ); } + + case NamespaceImportInstruction namespaceImport -> + WasmCodeGenNamespaces.importValue(namespaceImport.namespaceName(), context); + case PushBoolInstruction pushBool -> context.addInstruction(new WasmI32Const(pushBool.value() ? 1 : 0)); diff --git a/src/main/java/org/shedlang/compiler/stackir/InstructionSerializer.java b/src/main/java/org/shedlang/compiler/stackir/InstructionSerializer.java index 12592b42..35789b18 100644 --- a/src/main/java/org/shedlang/compiler/stackir/InstructionSerializer.java +++ b/src/main/java/org/shedlang/compiler/stackir/InstructionSerializer.java @@ -93,6 +93,12 @@ public class InstructionSerializer { treeString(namespaceFieldStore.namespaceName().toString()), treeString(namespaceFieldStore.fieldName()) ); + + case NamespaceImportInstruction namespaceImport -> + treeList( + treeIdentifier("namespace-import"), + treeString(namespaceImport.namespaceName().toString()) + ); case PushBoolInstruction pushBoolInstruction -> treeList( 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 50607e02..1fb0bede 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, NamespaceFieldStoreInstruction, PushBoolInstruction, PushIntInstruction, PushStringInstruction, PushUnitInstruction, ReturnInstruction { + permits CallInstruction, DefineFunctionInstruction, DiscardInstruction, LocalLoadInstruction, LocalStoreInstruction, NamespaceFieldStoreInstruction, NamespaceImportInstruction, PushBoolInstruction, PushIntInstruction, PushStringInstruction, PushUnitInstruction, ReturnInstruction { Source source(); } diff --git a/src/main/java/org/shedlang/compiler/stackir/instructions/NamespaceImportInstruction.java b/src/main/java/org/shedlang/compiler/stackir/instructions/NamespaceImportInstruction.java new file mode 100644 index 00000000..3e7abd7f --- /dev/null +++ b/src/main/java/org/shedlang/compiler/stackir/instructions/NamespaceImportInstruction.java @@ -0,0 +1,10 @@ +package org.shedlang.compiler.stackir.instructions; + +import org.shedlang.compiler.sources.Source; +import org.shedlang.compiler.types.NamespaceName; + +public record NamespaceImportInstruction( + NamespaceName namespaceName, + Source source +) implements Instruction { +} -- cgit v1.2.3