diff options
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); |
