aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/jq/codegen.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/jq/codegen.zig')
-rw-r--r--src/jq/codegen.zig24
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);