summaryrefslogtreecommitdiff
path: root/src/mods/Parser.zig
diff options
context:
space:
mode:
authorLorenzo Torres <torres@sideros.org>2025-03-27 21:44:47 +0100
committerLorenzo Torres <torres@sideros.org>2025-03-27 21:44:47 +0100
commit11f6bc2b04fae03a6e81735d4bcebe9505c5d76d (patch)
tree1f4db0cc1467217582331cab9dc30e6663e0ebbf /src/mods/Parser.zig
parent1730f1e2980bfa2819c541d9b8a3bc0301b8334e (diff)
parent6fe4855a67d025c7a283827d566130e1c6ade638 (diff)
Merge branch 'master' of ssh://git.sideros.org:/git/sideros
Diffstat (limited to 'src/mods/Parser.zig')
-rw-r--r--src/mods/Parser.zig22
1 files changed, 16 insertions, 6 deletions
diff --git a/src/mods/Parser.zig b/src/mods/Parser.zig
index 2e3c434..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).*;
@@ -140,7 +148,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,
@@ -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;