From 57f06b7309aad18d83e9ecb04d7c59ccea527f17 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sun, 25 Jan 2026 22:10:05 +0900 Subject: implement and/or operators --- src/jq/execute.zig | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'src/jq/execute.zig') diff --git a/src/jq/execute.zig b/src/jq/execute.zig index caf525a..b30bd3d 100644 --- a/src/jq/execute.zig +++ b/src/jq/execute.zig @@ -183,9 +183,34 @@ pub const Runtime = struct { .jump => |offset| { self.pc += offset - 1; }, + .jump_unless => |offset| { + std.debug.assert(self.values.ensureSize(1)); + + const value = self.values.pop(); + const is_falsy = switch (value) { + .null => true, + .bool => |b| !b, + else => false, + }; + if (is_falsy) { + self.pc += offset - 1; + } + // FIXME: optimize pop and push + try self.values.push(value); + }, .fork => |offset| { try self.save_stack(self.pc + offset); }, + .dup => { + std.debug.assert(self.values.ensureSize(1)); + + try self.values.dup(); + }, + .pop => { + std.debug.assert(self.values.ensureSize(1)); + + _ = self.values.pop(); + }, .subexp_begin => try self.values.dup(), .subexp_end => try self.values.swap(), .index => { @@ -309,6 +334,18 @@ pub const Runtime = struct { _ = self.values.pop(); try self.values.push(self.constants.items[@intFromEnum(idx)]); }, + .const_true => { + std.debug.assert(self.values.ensureSize(1)); + + _ = self.values.pop(); + try self.values.push(.{ .bool = true }); + }, + .const_false => { + std.debug.assert(self.values.ensureSize(1)); + + _ = self.values.pop(); + try self.values.push(.{ .bool = false }); + }, } } -- cgit v1.3-1-g0d28