| ... | ... | @@ -173,7 +173,7 @@ pub fn openPath(allocator: Allocator, sub_path: []const u8, options: link.Option |
| 173 | 173 | }; |
| 174 | 174 | const symbol = try wasm_bin.symbols.addOne(allocator); |
| 175 | 175 | symbol.* = .{ |
| 176 | | .name = try allocator.dupeZ(u8, "__stack_pointer"), |
| 176 | .name = "__stack_pointer", |
| 177 | 177 | .tag = .global, |
| 178 | 178 | .flags = 0, |
| 179 | 179 | .index = 0, |
| ... | ... | @@ -298,6 +298,10 @@ pub fn deinit(self: *Wasm) void { |
| 298 | 298 | var decl_it = self.decls.keyIterator(); |
| 299 | 299 | while (decl_it.next()) |decl_ptr| { |
| 300 | 300 | const decl = decl_ptr.*; |
| 301 | const atom: *Atom = &decl.link.wasm; |
| 302 | for (atom.locals.items) |local| { |
| 303 | gpa.free(mem.sliceTo(self.symbols.items[local.sym_index].name, 0)); |
| 304 | } |
| 301 | 305 | decl.link.wasm.deinit(gpa); |
| 302 | 306 | } |
| 303 | 307 | |
| ... | ... | @@ -312,12 +316,6 @@ pub fn deinit(self: *Wasm) void { |
| 312 | 316 | object.deinit(gpa); |
| 313 | 317 | } |
| 314 | 318 | |
| 315 | | for (self.symbols.items) |symbol| { |
| 316 | | if (symbol.tag != .dead) { |
| 317 | | gpa.free(mem.sliceTo(symbol.name, 0)); |
| 318 | | } |
| 319 | | } |
| 320 | | |
| 321 | 319 | self.decls.deinit(gpa); |
| 322 | 320 | self.symbols.deinit(gpa); |
| 323 | 321 | self.symbols_free_list.deinit(gpa); |
| ... | ... | @@ -463,7 +461,7 @@ fn finishUpdateDecl(self: *Wasm, decl: *Module.Decl, code: []const u8) !void { |
| 463 | 461 | atom.size = @intCast(u32, code.len); |
| 464 | 462 | atom.alignment = decl.ty.abiAlignment(self.base.options.target); |
| 465 | 463 | const symbol = &self.symbols.items[atom.sym_index]; |
| 466 | | symbol.name = try self.base.allocator.dupeZ(u8, std.mem.sliceTo(decl.name, 0)); |
| 464 | symbol.name = decl.name; |
| 467 | 465 | symbol.setFlag(.WASM_SYM_BINDING_LOCAL); |
| 468 | 466 | try atom.code.appendSlice(self.base.allocator, code); |
| 469 | 467 | } |
| ... | ... | @@ -565,13 +563,13 @@ pub fn freeDecl(self: *Wasm, decl: *Module.Decl) void { |
| 565 | 563 | const atom = &decl.link.wasm; |
| 566 | 564 | self.symbols_free_list.append(self.base.allocator, atom.sym_index) catch {}; |
| 567 | 565 | _ = self.decls.remove(decl); |
| 568 | | self.symbols.items[atom.sym_index].tag = .dead; // to ensure it does not end in the names section |
| 566 | self.symbols.items[atom.sym_index].tag = .dead; |
| 569 | 567 | for (atom.locals.items) |local_atom| { |
| 570 | | self.symbols.items[local_atom.sym_index].tag = .dead; // also for any local symbol |
| 571 | | // self.base.allocator.free(mem.sliceTo(self.symbols.items[local_atom.sym_index].name, 0)); |
| 568 | const local_symbol = &self.symbols.items[local_atom.sym_index]; |
| 569 | local_symbol.tag = .dead; // also for any local symbol |
| 570 | self.base.allocator.free(mem.sliceTo(local_symbol.name, 0)); |
| 572 | 571 | self.symbols_free_list.append(self.base.allocator, local_atom.sym_index) catch {}; |
| 573 | 572 | } |
| 574 | | // self.base.allocator.free(mem.sliceTo(self.symbols.items[atom.sym_index].name, 0)); |
| 575 | 573 | |
| 576 | 574 | if (decl.isExtern()) { |
| 577 | 575 | assert(self.imports.remove(.{ .file = null, .index = atom.sym_index })); |
| ... | ... | @@ -600,11 +598,14 @@ fn mapFunctionTable(self: *Wasm) void { |
| 600 | 598 | fn addOrUpdateImport(self: *Wasm, decl: *Module.Decl) !void { |
| 601 | 599 | const symbol_index = decl.link.wasm.sym_index; |
| 602 | 600 | const symbol: *Symbol = &self.symbols.items[symbol_index]; |
| 603 | | const decl_name = mem.sliceTo(decl.name, 0); |
| 604 | | symbol.name = try self.base.allocator.dupeZ(u8, decl_name); |
| 601 | symbol.name = decl.name; |
| 605 | 602 | symbol.setUndefined(true); |
| 606 | 603 | // also add it as a global so it can be resolved |
| 607 | | try self.globals.putNoClobber(self.base.allocator, decl_name, .{ .file = null, .index = symbol_index }); |
| 604 | try self.globals.putNoClobber( |
| 605 | self.base.allocator, |
| 606 | mem.sliceTo(symbol.name, 0), |
| 607 | .{ .file = null, .index = symbol_index }, |
| 608 | ); |
| 608 | 609 | switch (decl.ty.zigTypeTag()) { |
| 609 | 610 | .Fn => { |
| 610 | 611 | const gop = try self.imports.getOrPut(self.base.allocator, .{ .index = symbol_index, .file = null }); |
| ... | ... | @@ -614,7 +615,7 @@ fn addOrUpdateImport(self: *Wasm, decl: *Module.Decl) !void { |
| 614 | 615 | if (!gop.found_existing) { |
| 615 | 616 | gop.value_ptr.* = .{ |
| 616 | 617 | .module_name = module_name, |
| 617 | | .name = std.mem.span(symbol.name), |
| 618 | .name = mem.sliceTo(symbol.name, 0), |
| 618 | 619 | .kind = .{ .function = decl.fn_link.wasm.type_index }, |
| 619 | 620 | }; |
| 620 | 621 | } |