diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-01-25 22:10:05 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-01-25 22:10:05 +0900 |
| commit | 57f06b7309aad18d83e9ecb04d7c59ccea527f17 (patch) | |
| tree | a15454411e2dbd5fc9f6aa92b78a079e88b4ab14 /src/jq/execute.zig | |
| parent | 8263832eb8c23968f0cfea15b5cb1bfa3546d540 (diff) | |
| download | zgjq-57f06b7309aad18d83e9ecb04d7c59ccea527f17.tar.gz zgjq-57f06b7309aad18d83e9ecb04d7c59ccea527f17.tar.zst zgjq-57f06b7309aad18d83e9ecb04d7c59ccea527f17.zip | |
implement and/or operators
Diffstat (limited to 'src/jq/execute.zig')
| -rw-r--r-- | src/jq/execute.zig | 37 |
1 files changed, 37 insertions, 0 deletions
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 }); + }, } } |
