aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-21 23:12:05 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-21 23:12:05 +0100
commitadadbcb3481b85af3130d26da1f3f8f85808cb6e (patch)
tree43935f0e9945423d5fca93cb1c22dceb702e623e /src/main/java
parent2a4a431bff2a825b83994daee89f164316e7cc31 (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.java35
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;