diff options
author | Ernesto Lanchares <elancha98@proton.me> | 2025-03-27 17:05:50 +0100 |
---|---|---|
committer | Ernesto Lanchares <elancha98@proton.me> | 2025-03-27 17:05:50 +0100 |
commit | 6fe4855a67d025c7a283827d566130e1c6ade638 (patch) | |
tree | 25cab9c52b0519b052b4f49fa42d68ea4d184038 /src/mods/Parser.zig | |
parent | dd3dc54b05f60d194c9401971831e509d109021b (diff) |
IR can now parse itself. :)
Now we have to reimplement the vm. :_)
Diffstat (limited to 'src/mods/Parser.zig')
-rw-r--r-- | src/mods/Parser.zig | 20 |
1 files changed, 15 insertions, 5 deletions
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; |