| ... | @@ -2286,7 +2286,9 @@ fn emitNameSection(self: *Wasm, file: fs.File, arena: Allocator) !void { | ... | @@ -2286,7 +2286,9 @@ fn emitNameSection(self: *Wasm, file: fs.File, arena: Allocator) !void { |
| 2286 | } | 2286 | } |
| 2287 | }; | 2287 | }; |
| 2288 | | 2288 | |
| 2289 | var funcs = try std.ArrayList(Name).initCapacity(arena, self.functions.count() + self.imported_functions_count); | 2289 | // we must de-duplicate symbols that point to the same function |
| | 2290 | var funcs = std.AutoArrayHashMap(u32, Name).init(arena); |
| | 2291 | try funcs.ensureUnusedCapacity(self.functions.count() + self.imported_functions_count); |
| 2290 | var globals = try std.ArrayList(Name).initCapacity(arena, self.wasm_globals.items.len + self.imported_globals_count); | 2292 | var globals = try std.ArrayList(Name).initCapacity(arena, self.wasm_globals.items.len + self.imported_globals_count); |
| 2291 | var segments = try std.ArrayList(Name).initCapacity(arena, self.data_segments.count()); | 2293 | var segments = try std.ArrayList(Name).initCapacity(arena, self.data_segments.count()); |
| 2292 | | 2294 | |
| ... | @@ -2296,7 +2298,12 @@ fn emitNameSection(self: *Wasm, file: fs.File, arena: Allocator) !void { | ... | @@ -2296,7 +2298,12 @@ fn emitNameSection(self: *Wasm, file: fs.File, arena: Allocator) !void { |
| 2296 | break :blk self.string_table.get(self.imports.get(sym_loc).?.name); | 2298 | break :blk self.string_table.get(self.imports.get(sym_loc).?.name); |
| 2297 | } else sym_loc.getName(self); | 2299 | } else sym_loc.getName(self); |
| 2298 | switch (symbol.tag) { | 2300 | switch (symbol.tag) { |
| 2299 | .function => try funcs.append(.{ .index = symbol.index, .name = name }), | 2301 | .function => { |
| | 2302 | const gop = funcs.getOrPutAssumeCapacity(symbol.index); |
| | 2303 | if (!gop.found_existing) { |
| | 2304 | gop.value_ptr.* = .{ .index = symbol.index, .name = name }; |
| | 2305 | } |
| | 2306 | }, |
| 2300 | .global => globals.appendAssumeCapacity(.{ .index = symbol.index, .name = name }), | 2307 | .global => globals.appendAssumeCapacity(.{ .index = symbol.index, .name = name }), |
| 2301 | else => {}, | 2308 | else => {}, |
| 2302 | } | 2309 | } |
| ... | @@ -2306,7 +2313,7 @@ fn emitNameSection(self: *Wasm, file: fs.File, arena: Allocator) !void { | ... | @@ -2306,7 +2313,7 @@ fn emitNameSection(self: *Wasm, file: fs.File, arena: Allocator) !void { |
| 2306 | segments.appendAssumeCapacity(.{ .index = @intCast(u32, index), .name = key }); | 2313 | segments.appendAssumeCapacity(.{ .index = @intCast(u32, index), .name = key }); |
| 2307 | } | 2314 | } |
| 2308 | | 2315 | |
| 2309 | std.sort.sort(Name, funcs.items, {}, Name.lessThan); | 2316 | std.sort.sort(Name, funcs.values(), {}, Name.lessThan); |
| 2310 | std.sort.sort(Name, globals.items, {}, Name.lessThan); | 2317 | std.sort.sort(Name, globals.items, {}, Name.lessThan); |
| 2311 | | 2318 | |
| 2312 | const header_offset = try reserveCustomSectionHeader(file); | 2319 | const header_offset = try reserveCustomSectionHeader(file); |
| ... | @@ -2314,7 +2321,7 @@ fn emitNameSection(self: *Wasm, file: fs.File, arena: Allocator) !void { | ... | @@ -2314,7 +2321,7 @@ fn emitNameSection(self: *Wasm, file: fs.File, arena: Allocator) !void { |
| 2314 | try leb.writeULEB128(writer, @intCast(u32, "name".len)); | 2321 | try leb.writeULEB128(writer, @intCast(u32, "name".len)); |
| 2315 | try writer.writeAll("name"); | 2322 | try writer.writeAll("name"); |
| 2316 | | 2323 | |
| 2317 | try self.emitNameSubsection(.function, funcs.items, writer); | 2324 | try self.emitNameSubsection(.function, funcs.values(), writer); |
| 2318 | try self.emitNameSubsection(.global, globals.items, writer); | 2325 | try self.emitNameSubsection(.global, globals.items, writer); |
| 2319 | try self.emitNameSubsection(.data_segment, segments.items, writer); | 2326 | try self.emitNameSubsection(.data_segment, segments.items, writer); |
| 2320 | | 2327 | |