From 978d93cccaa4d69bcd1810b46a30606d514e870f Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 24 Jun 2023 18:47:09 +0100 Subject: WASM binary format: support global imports --- .../compiler/backends/wasm/structure/WasmBinaryFormat.java | 13 +++++++++++++ .../wasm/structure/ast/imports/WasmImportDescriptor.java | 2 ++ .../backends/wasm/structure/ast/types/WasmGlobalType.java | 4 ++++ .../backends/wasm/structure/ast/types/WasmMutability.java | 6 ++++++ 4 files changed, 25 insertions(+) create mode 100644 src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/types/WasmGlobalType.java create mode 100644 src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/types/WasmMutability.java (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/structure/WasmBinaryFormat.java b/src/main/java/org/shedlang/compiler/backends/wasm/structure/WasmBinaryFormat.java index 714f1936..b21ea2a0 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/structure/WasmBinaryFormat.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/structure/WasmBinaryFormat.java @@ -109,6 +109,10 @@ public class WasmBinaryFormat { writer.writeByte(0x02); writeMemoryType(memory.type(), writer); } + case WasmImportDescriptor.Global global -> { + writer.writeByte(0x03); + writeGlobalType(global.type(), writer); + } } } @@ -159,6 +163,15 @@ public class WasmBinaryFormat { writeLimits(type.limits(), writer); } + private static void writeGlobalType(WasmGlobalType type, BinaryWriter writer) { + writeValueType(type.valueType(), writer); + var mutabilityEncoding = switch (type.mutability()) { + case MUTABLE -> 0x01; + case IMMUTABLE -> 0x00; + }; + writer.writeByte(mutabilityEncoding); + } + private static void writeReferenceType(WasmReferenceType type, BinaryWriter writer) { var encoding = switch (type) { case FUNC_REF -> 0x70; diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/imports/WasmImportDescriptor.java b/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/imports/WasmImportDescriptor.java index e0bdc456..c9e6ba5f 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/imports/WasmImportDescriptor.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/imports/WasmImportDescriptor.java @@ -1,6 +1,7 @@ package org.shedlang.compiler.backends.wasm.structure.ast.imports; import org.shedlang.compiler.backends.wasm.structure.ast.types.WasmFuncType; +import org.shedlang.compiler.backends.wasm.structure.ast.types.WasmGlobalType; import org.shedlang.compiler.backends.wasm.structure.ast.types.WasmMemoryType; import org.shedlang.compiler.backends.wasm.structure.ast.types.WasmTableType; @@ -8,4 +9,5 @@ public sealed interface WasmImportDescriptor { record Func(String identifier, WasmFuncType type) implements WasmImportDescriptor {} record Table(WasmTableType type) implements WasmImportDescriptor {} record Memory(WasmMemoryType type) implements WasmImportDescriptor {} + record Global(WasmGlobalType type) implements WasmImportDescriptor {} } diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/types/WasmGlobalType.java b/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/types/WasmGlobalType.java new file mode 100644 index 00000000..5d328f36 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/types/WasmGlobalType.java @@ -0,0 +1,4 @@ +package org.shedlang.compiler.backends.wasm.structure.ast.types; + +public record WasmGlobalType(WasmValueType valueType, WasmMutability mutability) { +} diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/types/WasmMutability.java b/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/types/WasmMutability.java new file mode 100644 index 00000000..afc9962f --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/types/WasmMutability.java @@ -0,0 +1,6 @@ +package org.shedlang.compiler.backends.wasm.structure.ast.types; + +public enum WasmMutability { + MUTABLE, + IMMUTABLE, +} -- cgit v1.2.3