From 7712c1d10ec45349c1cd6e66281b7d602350065d Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sat, 31 Jan 2026 15:53:23 +0900 Subject: implement slice expression --- src/jq/codegen.zig | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'src/jq/codegen.zig') 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); -- cgit v1.3-1-g0d28