From bfe9fb5e639573add9a153473be93db7d1703706 Mon Sep 17 00:00:00 2001 From: luccie-cmd Date: Wed, 26 Mar 2025 17:18:32 +0100 Subject: Removed IR parsing and changed fatal bug of i64s being detected as i32s Signed-off-by: luccie-cmd --- src/mods/Parser.zig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/mods/Parser.zig') diff --git a/src/mods/Parser.zig b/src/mods/Parser.zig index 2e3c434..080b407 100644 --- a/src/mods/Parser.zig +++ b/src/mods/Parser.zig @@ -140,7 +140,7 @@ fn parseVector(self: *Parser, parse_fn: anytype) ![]VectorFnResult(parse_fn) { fn parseNumtype(self: *Parser) !std.wasm.Valtype { return switch (try self.readByte()) { 0x7F => .i32, - 0x7E => .i32, + 0x7E => .i64, 0x7D => .f32, 0x7C => .f64, else => Error.invalid_numtype, @@ -462,7 +462,7 @@ fn parseCode(self: *Parser) !Func { local_count += l.n; } - _ = try IR.parse(self); + // _ = try IR.parse(self); const func = Func{ .locals = try self.allocator.alloc(Valtype, local_count), -- cgit v1.2.3 From 6fe4855a67d025c7a283827d566130e1c6ade638 Mon Sep 17 00:00:00 2001 From: Ernesto Lanchares Date: Thu, 27 Mar 2025 17:05:50 +0100 Subject: IR can now parse itself. :) Now we have to reimplement the vm. :_) --- src/mods/Parser.zig | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) (limited to 'src/mods/Parser.zig') diff --git a/src/mods/Parser.zig b/src/mods/Parser.zig index 080b407..6883fd3 100644 --- a/src/mods/Parser.zig +++ b/src/mods/Parser.zig @@ -39,6 +39,8 @@ pub const FunctionScope = enum { const Parser = @This(); pub const Error = error{ + OutOfMemory, + Overflow, invalid_instruction, invalid_magic, invalid_version, @@ -53,6 +55,8 @@ pub const Error = error{ invalid_globaltype, invalid_importdesc, invalid_exportdesc, + double_else, + unresolved_branch, unterminated_wasm, }; @@ -61,8 +65,8 @@ fn warn(self: Parser, s: []const u8) void { std.debug.print("[WARN]: Parsing of {s} unimplemented at byte index {d}\n", .{ s, self.byte_idx }); } -// TODO: remove peek -fn peek(self: Parser) ?u8 { +// TODO: remove peek? +pub fn peek(self: Parser) ?u8 { return if (self.byte_idx < self.bytes.len) self.bytes[self.byte_idx] else null; } @@ -92,6 +96,10 @@ pub fn readI64(self: *Parser) !i64 { return std.leb.readIleb128(i64, self); } +pub fn readI33(self: *Parser) !i33 { + return std.leb.readIleb128(i33, self); +} + pub fn readF32(self: *Parser) !f32 { const bytes = try self.read(@sizeOf(f32)); return std.mem.bytesAsValue(f32, bytes).*; @@ -154,7 +162,7 @@ fn parseVectype(self: *Parser) !std.wasm.Valtype { }; } -fn parseReftype(self: *Parser) !std.wasm.RefType { +pub fn parseReftype(self: *Parser) !std.wasm.RefType { return switch (try self.readByte()) { 0x70 => .funcref, 0x6F => .externref, @@ -462,11 +470,13 @@ fn parseCode(self: *Parser) !Func { local_count += l.n; } - // _ = try IR.parse(self); + const ir = try IR.parse(self); + const stdout = std.io.getStdOut().writer(); + try ir.print(stdout); const func = Func{ .locals = try self.allocator.alloc(Valtype, local_count), - .code = try self.read(end_idx - self.byte_idx), + .code = &.{}, }; var li: usize = 0; -- cgit v1.2.3