diff options
| author | Luuk de Gram <luuk@degram.dev> | 2021-12-05 12:34:50 +0100 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2021-12-05 12:19:01 -0800 |
| commit | 9e03cf948948ea25feb3f413f234e98e71d55786 (patch) | |
| tree | 79a20fe0103e9615e1193bc2320d95523bf03601 /src/link/Wasm.zig | |
| parent | a1b79ea5857a52332d9da49d261a7fd04e52a466 (diff) | |
| download | zig-9e03cf948948ea25feb3f413f234e98e71d55786.tar.gz zig-9e03cf948948ea25feb3f413f234e98e71d55786.zip | |
wasm: Initial behavior tests succeeding
- Correctly load slice value on stack
- Implement WrapErrorUnionErr and payload
- Implement trunc, fix sliceLen and write undefined
- Implement slice as return type and argument
Note: This also fixes a memory leak for inferred error sets, and for usingnamespace
Diffstat (limited to 'src/link/Wasm.zig')
| -rw-r--r-- | src/link/Wasm.zig | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/src/link/Wasm.zig b/src/link/Wasm.zig index 367f3376f0..12afc7164c 100644 --- a/src/link/Wasm.zig +++ b/src/link/Wasm.zig @@ -162,9 +162,8 @@ pub fn deinit(self: *Wasm) void { decl.link.wasm.deinit(self.base.allocator); } - for (self.func_types.items) |func_type| { - self.base.allocator.free(func_type.params); - self.base.allocator.free(func_type.returns); + for (self.func_types.items) |*func_type| { + func_type.deinit(self.base.allocator); } for (self.segment_info.items) |segment_info| { self.base.allocator.free(segment_info.name); @@ -278,7 +277,7 @@ pub fn updateDecl(self: *Wasm, module: *Module, decl: *Module.Decl) !void { defer codegen.deinit(); // generate the 'code' section for the function declaration - const result = codegen.genDecl(decl.ty, decl.val) catch |err| switch (err) { + const result = codegen.genDecl() catch |err| switch (err) { error.CodegenFail => { decl.analysis = .codegen_failure; try module.failed_decls.put(module.gpa, decl, codegen.err_msg); @@ -298,6 +297,7 @@ fn finishUpdateDecl(self: *Wasm, decl: *Module.Decl, result: CodeGen.Result, cod if (decl.isExtern()) { try self.addOrUpdateImport(decl); + return; } if (code.len == 0) return; @@ -574,7 +574,6 @@ fn resetState(self: *Wasm) void { self.segments.clearRetainingCapacity(); self.segment_info.clearRetainingCapacity(); self.data_segments.clearRetainingCapacity(); - self.function_table.clearRetainingCapacity(); self.atoms.clearRetainingCapacity(); self.code_section_index = null; } @@ -684,12 +683,16 @@ pub fn flushModule(self: *Wasm, comp: *Compilation) !void { ); } + // Table section if (self.function_table.count() > 0) { const header_offset = try reserveVecSectionHeader(file); const writer = file.writer(); try leb.writeULEB128(writer, wasm.reftype(.funcref)); - try emitLimits(writer, .{ .min = 1, .max = null }); + try emitLimits(writer, .{ + .min = @intCast(u32, self.function_table.count()), + .max = null, + }); try writeVecSectionHeader( file, |
