diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-21 23:12:05 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-21 23:12:05 +0100 |
| commit | adadbcb3481b85af3130d26da1f3f8f85808cb6e (patch) | |
| tree | 43935f0e9945423d5fca93cb1c22dceb702e623e /src/main/java | |
| parent | 2a4a431bff2a825b83994daee89f164316e7cc31 (diff) | |
Write names of imported functions
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/backends/wasm/structure/WasmBinaryFormat.java | 35 |
1 files changed, 31 insertions, 4 deletions
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 f9fceab5..b472eecd 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 @@ -6,7 +6,6 @@ import org.shedlang.compiler.backends.wasm.structure.ast.imports.WasmImport; import org.shedlang.compiler.backends.wasm.structure.ast.imports.WasmImportDescriptor; import org.shedlang.compiler.backends.wasm.structure.ast.types.WasmFuncType; import org.shedlang.compiler.backends.wasm.structure.ast.types.WasmValueType; -import org.shedlang.compiler.util.Action; import java.io.IOException; import java.io.OutputStream; @@ -49,6 +48,7 @@ public class WasmBinaryFormat { writer.writeBytes(WASM_VERSION); writeTypeSection(module.types(), writer); writeImportSection(module, writer); + writeNameSection(module, writer); outputStream.write(writer.toBytes()); } @@ -103,6 +103,21 @@ public class WasmBinaryFormat { } } + private static void writeNameSection(WasmModule module, BinaryWriter writer) throws IOException { + if (module.imports().size() > 0) { + writeSection(SectionType.CUSTOM, writer, () -> { + writeString("name", writer); + writeSection((byte) 1, writer, () -> { + Leb128Encoding.encodeUnsignedInt32(module.imports().size(), writer); + for (var importIndex = 0; importIndex < module.imports().size(); importIndex++) { + Leb128Encoding.encodeUnsignedInt32(importIndex, writer); + writeString(module.imports().get(importIndex).identifier(), writer); + }; + }); + }); + } + } + private static void writeFuncType(WasmFuncType type, BinaryWriter writer) { writer.writeByte((byte) 0x60); writeValueTypeVector(type.params(), writer); @@ -126,10 +141,22 @@ public class WasmBinaryFormat { writer.writeByte((byte) encoding); } + interface Write { + void write() throws IOException; + } + private static void writeSection( SectionType sectionType, BinaryWriter writer, - Action writeContent + Write writeContent + ) throws IOException { + writeSection(sectionType.id, writer, writeContent); + } + + private static void writeSection( + byte id, + BinaryWriter writer, + Write writeContent ) throws IOException { // https://webassembly.github.io/spec/core/binary/modules.html#sections // @@ -137,13 +164,13 @@ public class WasmBinaryFormat { // * a one-byte section ID // * the u32 size of the contents, in bytes // * the actual contents - writer.writeByte(sectionType.id); + writer.writeByte(id); var sizePosition = writer.position(); Leb128Encoding.encodePaddedUnsignedInt32(0, writer); var contentStartPosition = writer.position(); - writeContent.call(); + writeContent.write(); var contentEndPosition = writer.position(); var size = contentEndPosition - contentStartPosition; |
