diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-01-31 15:53:23 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-01-31 15:57:48 +0900 |
| commit | 7712c1d10ec45349c1cd6e66281b7d602350065d (patch) | |
| tree | 92208e7fb1955fd9847d91affa25ec096012ab9b /src/jq/codegen.zig | |
| parent | 617ddc62aa4d3153850362526069b85bfaf5e59e (diff) | |
| download | zgjq-7712c1d10ec45349c1cd6e66281b7d602350065d.tar.gz zgjq-7712c1d10ec45349c1cd6e66281b7d602350065d.tar.zst zgjq-7712c1d10ec45349c1cd6e66281b7d602350065d.zip | |
implement slice expression
Diffstat (limited to 'src/jq/codegen.zig')
| -rw-r--r-- | src/jq/codegen.zig | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/jq/codegen.zig b/src/jq/codegen.zig index 6ca5382..62535c1 100644 --- a/src/jq/codegen.zig +++ b/src/jq/codegen.zig @@ -19,6 +19,8 @@ pub const Opcode = enum { subexp_end, index, index_opt, + slice, + slice_opt, add, sub, mul, @@ -52,6 +54,8 @@ pub const Instr = union(Opcode) { subexp_end, index, index_opt, + slice, + slice_opt, add, sub, mul, @@ -97,6 +101,26 @@ const Codegen = struct { try self.emit(.subexp_end); try self.emit(if (idx.is_optional) .index_opt else .index); }, + .slice => |slice| { + try self.generate(slice.base); + // from + try self.emit(.subexp_begin); + if (slice.from) |from| { + try self.generate(from); + } else { + try self.emit(.{ .@"const" = .null }); + } + try self.emit(.subexp_end); + // to + try self.emit(.subexp_begin); + if (slice.to) |to| { + try self.generate(to); + } else { + try self.emit(.{ .@"const" = .null }); + } + try self.emit(.subexp_end); + try self.emit(if (slice.is_optional) .slice_opt else .slice); + }, .literal => |idx| try self.emit(.{ .@"const" = idx }), .binary_expr => |binary_expr| { try self.emit(.subexp_begin); |
