authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-01-13 17:52:39-08:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-01-15 15:11:36-08:00
log0cf163089e7948efa9082e519229beeb7e651f25
treea7944291147460766d2c8d2115ee44e127b2e424
parentcde84c8795e8da13512098c8b19f17217e691dde

wasm linker: fix `@tagName` for auto-numbered non-exhaustive enums


1 files changed, 4 insertions(+), 3 deletions(-)

src/link/Wasm/Flush.zig+4-3
...@@ -1909,14 +1909,15 @@ fn emitTagNameFunction(...@@ -1909,14 +1909,15 @@ fn emitTagNameFunction(
1909 const zcu = comp.zcu.?;1909 const zcu = comp.zcu.?;
1910 const ip = &zcu.intern_pool;1910 const ip = &zcu.intern_pool;
1911 const enum_type = ip.loadEnumType(enum_type_ip);1911 const enum_type = ip.loadEnumType(enum_type_ip);
1912 const tag_values = enum_type.values.get(ip);
19121913
1913 try code.ensureUnusedCapacity(gpa, 7 * 5 + 6 + 1 * 6);1914 try code.ensureUnusedCapacity(gpa, 7 * 5 + 6 + 1 * 6);
1914 appendReservedUleb32(code, 0); // no locals1915 appendReservedUleb32(code, 0); // no locals
19151916
1916 const slice_abi_size = 8;1917 const slice_abi_size = 8;
1917 const encoded_alignment = @ctz(@as(u32, 4));1918 const encoded_alignment = @ctz(@as(u32, 4));
1918 if (enum_type.tag_mode == .auto) {1919 if (tag_values.len == 0) {
1919 // Then it's a direct table lookup.1920 // Then it's auto-numbered and therefore a direct table lookup.
1920 code.appendAssumeCapacity(@intFromEnum(std.wasm.Opcode.local_get));1921 code.appendAssumeCapacity(@intFromEnum(std.wasm.Opcode.local_get));
1921 appendReservedUleb32(code, 0);1922 appendReservedUleb32(code, 0);
19221923
...@@ -1948,7 +1949,7 @@ fn emitTagNameFunction(...@@ -1948,7 +1949,7 @@ fn emitTagNameFunction(
1948 code.appendAssumeCapacity(@intFromEnum(std.wasm.Opcode.block));1949 code.appendAssumeCapacity(@intFromEnum(std.wasm.Opcode.block));
1949 code.appendAssumeCapacity(@intFromEnum(outer_block_type));1950 code.appendAssumeCapacity(@intFromEnum(outer_block_type));
19501951
1951 for (enum_type.values.get(ip), 0..) |tag_value, tag_index| {1952 for (tag_values, 0..) |tag_value, tag_index| {
1952 // block for this if case1953 // block for this if case
1953 code.appendAssumeCapacity(@intFromEnum(std.wasm.Opcode.block));1954 code.appendAssumeCapacity(@intFromEnum(std.wasm.Opcode.block));
1954 code.appendAssumeCapacity(@intFromEnum(std.wasm.BlockType.empty));1955 code.appendAssumeCapacity(@intFromEnum(std.wasm.BlockType.empty));