From 2eea1f201f4ff7829b8b17b192d3a2aeec7c9e9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=83=AA=E3=82=AD=E8=90=8C?= Date: Tue, 2 Sep 2025 20:30:47 +0200 Subject: [PATCH] h2: add better VM value stack tracing --- crates/haku2/src/vm.zig | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/crates/haku2/src/vm.zig b/crates/haku2/src/vm.zig index 910cb13..7bec9a1 100644 --- a/crates/haku2/src/vm.zig +++ b/crates/haku2/src/vm.zig @@ -147,6 +147,24 @@ pub fn stackFrame(vm: *const Vm, index: usize) StackFrame { } } +const StackFmt = struct { + stack: []const Value, + + pub fn format(f: *const StackFmt, writer: *std.Io.Writer) !void { + try writer.writeAll("["); + for (f.stack, 0..) |val, i| { + if (i != 0) + try writer.writeAll(", "); + try val.format(writer); + } + try writer.writeAll("]"); + } +}; + +fn stackFmt(stack: []const Value) StackFmt { + return .{ .stack = stack }; +} + /// Debug assertion for bytecode validity. /// In future versions, this may become disabled in release builds. fn validateBytecode(vm: *Vm, ok: bool, comptime fmt: []const u8, args: anytype) Error!void { @@ -167,7 +185,7 @@ pub fn push(vm: *Vm, val: Value) Error!void { if (vm.stack_top >= vm.stack.len) { return vm.throw("too many live temporary values (local variables and expression operands)", .{}); } - log.debug("PUSH {any} <- {f}", .{ vm.stack[0..vm.stack_top], val }); + log.debug("PUSH {f} <- {f}", .{ stackFmt(vm.stack[0..vm.stack_top]), val }); vm.stack[vm.stack_top] = val; vm.stack_top += 1; } @@ -176,7 +194,7 @@ pub fn pop(vm: *Vm) Error!Value { try vm.validateBytecode(vm.stack_top > 0, "value stack underflow", .{}); vm.stack_top -= 1; const result = vm.stack[vm.stack_top]; - log.debug("POP {any} -> {f}", .{ vm.stack[0..vm.stack_top], result }); + log.debug("POP {f} -> {f}", .{ stackFmt(vm.stack[0..vm.stack_top]), result }); return vm.stack[vm.stack_top]; }