From bbe9213573943f2ac5cc840bfb1788e756353449 Mon Sep 17 00:00:00 2001 From: luccie-cmd Date: Fri, 21 Mar 2025 12:43:49 +0100 Subject: Added block instruction in WASM VM Signed-off-by: luccie-cmd --- src/main.zig | 2 +- src/mods/vm.zig | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/main.zig b/src/main.zig index 9c3e59d..cb3c1db 100644 --- a/src/main.zig +++ b/src/main.zig @@ -25,7 +25,7 @@ pub fn main() !void { //defer runtime.deinit(allocator); //var parameters = [_]usize{}; - //try runtime.callExternal(allocator, "calculate_fibonacci", ¶meters); + //try runtime.callExternal(allocator, "preinit", ¶meters); const w = try window.Window.create(800, 600, "sideros"); defer w.destroy(); diff --git a/src/mods/vm.zig b/src/mods/vm.zig index f8c7db5..2558ced 100644 --- a/src/mods/vm.zig +++ b/src/mods/vm.zig @@ -79,6 +79,23 @@ pub const Runtime = struct { frame.program_counter += 1; std.debug.print("b: {x}\n", .{byte}); switch (byte) { + 0x02 => { + var depth: usize = 1; + var pc = frame.program_counter; + while (depth > 0) { + const opcode = frame.code[pc]; + const operand = frame.code[pc+1]; + if (opcode == 0x02 and operand == 0x40) { + depth += 1; + } else if (opcode == 0x0B) { + depth -= 1; + } + + pc += 1; // Move forward + } + try self.labels.append(pc); + frame.program_counter += 1; + }, 0x03 => { try self.labels.append(frame.program_counter); frame.program_counter += 1; @@ -479,6 +496,8 @@ pub const Runtime = struct { pub fn callExternal(self: *Runtime, allocator: Allocator, name: []const u8, parameters: []usize) !void { if (self.module.exports.get(name)) |function| { try self.call(allocator, function, parameters); + } else { + std.debug.panic("Function `{s}` not avaliable", .{name}); } } -- cgit v1.2.3