| ... | ... | @@ -135,11 +135,10 @@ pub fn nextAllocMax(self: *@This(), allocator: Allocator, when: AllocWhen, max_v |
| 135 | 135 | }; |
| 136 | 136 | switch (token_type) { |
| 137 | 137 | .number, .string => { |
| 138 | | var value_list = std.array_list.Managed(u8).init(allocator); |
| 139 | | errdefer { |
| 140 | | value_list.deinit(); |
| 141 | | } |
| 142 | | if (self.allocNextIntoArrayListMax(&value_list, when, max_value_len) catch |e| switch (e) { |
| 138 | var value_list: std.ArrayList(u8) = .empty; |
| 139 | defer value_list.deinit(allocator); |
| 140 | |
| 141 | if (self.allocNextIntoArrayListMax(allocator, &value_list, when, max_value_len) catch |e| switch (e) { |
| 143 | 142 | error.BufferUnderrun => unreachable, |
| 144 | 143 | else => |err| return err, |
| 145 | 144 | }) |slice| { |
| ... | ... | @@ -149,9 +148,9 @@ pub fn nextAllocMax(self: *@This(), allocator: Allocator, when: AllocWhen, max_v |
| 149 | 148 | Token{ .string = slice }; |
| 150 | 149 | } else { |
| 151 | 150 | return if (token_type == .number) |
| 152 | | Token{ .allocated_number = try value_list.toOwnedSlice() } |
| 151 | Token{ .allocated_number = try value_list.toOwnedSlice(allocator) } |
| 153 | 152 | else |
| 154 | | Token{ .allocated_string = try value_list.toOwnedSlice() }; |
| 153 | Token{ .allocated_string = try value_list.toOwnedSlice(allocator) }; |
| 155 | 154 | } |
| 156 | 155 | }, |
| 157 | 156 | |
| ... | ... | @@ -172,8 +171,8 @@ pub fn nextAllocMax(self: *@This(), allocator: Allocator, when: AllocWhen, max_v |
| 172 | 171 | } |
| 173 | 172 | |
| 174 | 173 | /// Equivalent to `allocNextIntoArrayListMax(value_list, when, default_max_value_len);` |
| 175 | | pub fn allocNextIntoArrayList(self: *@This(), value_list: *std.array_list.Managed(u8), when: AllocWhen) AllocIntoArrayListError!?[]const u8 { |
| 176 | | return self.allocNextIntoArrayListMax(value_list, when, default_max_value_len); |
| 174 | pub fn allocNextIntoArrayList(self: *@This(), allocator: Allocator, value_list: *std.ArrayList(u8), when: AllocWhen) AllocIntoArrayListError!?[]const u8 { |
| 175 | return self.allocNextIntoArrayListMax(allocator, value_list, when, default_max_value_len); |
| 177 | 176 | } |
| 178 | 177 | /// The next token type must be either `.number` or `.string`. See `peekNextTokenType()`. |
| 179 | 178 | /// When allocation is not necessary with `.alloc_if_needed`, |
| ... | ... | @@ -185,25 +184,25 @@ pub fn allocNextIntoArrayList(self: *@This(), value_list: *std.array_list.Manage |
| 185 | 184 | /// can be resumed by passing the same array list in again. |
| 186 | 185 | /// This method does not indicate whether the token content being returned is for a `.number` or `.string` token type; |
| 187 | 186 | /// the caller of this method is expected to know which type of token is being processed. |
| 188 | | pub fn allocNextIntoArrayListMax(self: *@This(), value_list: *std.array_list.Managed(u8), when: AllocWhen, max_value_len: usize) AllocIntoArrayListError!?[]const u8 { |
| 187 | pub fn allocNextIntoArrayListMax(self: *@This(), allocator: Allocator, value_list: *std.ArrayList(u8), when: AllocWhen, max_value_len: usize) AllocIntoArrayListError!?[]const u8 { |
| 189 | 188 | while (true) { |
| 190 | 189 | const token = try self.next(); |
| 191 | 190 | switch (token) { |
| 192 | 191 | // Accumulate partial values. |
| 193 | 192 | .partial_number, .partial_string => |slice| { |
| 194 | | try appendSlice(value_list, slice, max_value_len); |
| 193 | try appendSlice(allocator, value_list, slice, max_value_len); |
| 195 | 194 | }, |
| 196 | 195 | .partial_string_escaped_1 => |buf| { |
| 197 | | try appendSlice(value_list, buf[0..], max_value_len); |
| 196 | try appendSlice(allocator, value_list, buf[0..], max_value_len); |
| 198 | 197 | }, |
| 199 | 198 | .partial_string_escaped_2 => |buf| { |
| 200 | | try appendSlice(value_list, buf[0..], max_value_len); |
| 199 | try appendSlice(allocator, value_list, buf[0..], max_value_len); |
| 201 | 200 | }, |
| 202 | 201 | .partial_string_escaped_3 => |buf| { |
| 203 | | try appendSlice(value_list, buf[0..], max_value_len); |
| 202 | try appendSlice(allocator, value_list, buf[0..], max_value_len); |
| 204 | 203 | }, |
| 205 | 204 | .partial_string_escaped_4 => |buf| { |
| 206 | | try appendSlice(value_list, buf[0..], max_value_len); |
| 205 | try appendSlice(allocator, value_list, buf[0..], max_value_len); |
| 207 | 206 | }, |
| 208 | 207 | |
| 209 | 208 | // Return complete values. |
| ... | ... | @@ -212,7 +211,7 @@ pub fn allocNextIntoArrayListMax(self: *@This(), value_list: *std.array_list.Man |
| 212 | 211 | // No alloc necessary. |
| 213 | 212 | return slice; |
| 214 | 213 | } |
| 215 | | try appendSlice(value_list, slice, max_value_len); |
| 214 | try appendSlice(allocator, value_list, slice, max_value_len); |
| 216 | 215 | // The token is complete. |
| 217 | 216 | return null; |
| 218 | 217 | }, |
| ... | ... | @@ -221,7 +220,7 @@ pub fn allocNextIntoArrayListMax(self: *@This(), value_list: *std.array_list.Man |
| 221 | 220 | // No alloc necessary. |
| 222 | 221 | return slice; |
| 223 | 222 | } |
| 224 | | try appendSlice(value_list, slice, max_value_len); |
| 223 | try appendSlice(allocator, value_list, slice, max_value_len); |
| 225 | 224 | // The token is complete. |
| 226 | 225 | return null; |
| 227 | 226 | }, |
| ... | ... | @@ -1607,20 +1606,19 @@ pub const Reader = struct { |
| 1607 | 1606 | const token_type = try self.peekNextTokenType(); |
| 1608 | 1607 | switch (token_type) { |
| 1609 | 1608 | .number, .string => { |
| 1610 | | var value_list = std.array_list.Managed(u8).init(allocator); |
| 1611 | | errdefer { |
| 1612 | | value_list.deinit(); |
| 1613 | | } |
| 1614 | | if (try self.allocNextIntoArrayListMax(&value_list, when, max_value_len)) |slice| { |
| 1609 | var value_list: std.ArrayList(u8) = .empty; |
| 1610 | defer value_list.deinit(allocator); |
| 1611 | |
| 1612 | if (try self.allocNextIntoArrayListMax(allocator, &value_list, when, max_value_len)) |slice| { |
| 1615 | 1613 | return if (token_type == .number) |
| 1616 | 1614 | Token{ .number = slice } |
| 1617 | 1615 | else |
| 1618 | 1616 | Token{ .string = slice }; |
| 1619 | 1617 | } else { |
| 1620 | 1618 | return if (token_type == .number) |
| 1621 | | Token{ .allocated_number = try value_list.toOwnedSlice() } |
| 1619 | Token{ .allocated_number = try value_list.toOwnedSlice(allocator) } |
| 1622 | 1620 | else |
| 1623 | | Token{ .allocated_string = try value_list.toOwnedSlice() }; |
| 1621 | Token{ .allocated_string = try value_list.toOwnedSlice(allocator) }; |
| 1624 | 1622 | } |
| 1625 | 1623 | }, |
| 1626 | 1624 | |
| ... | ... | @@ -1638,13 +1636,19 @@ pub const Reader = struct { |
| 1638 | 1636 | } |
| 1639 | 1637 | |
| 1640 | 1638 | /// Equivalent to `allocNextIntoArrayListMax(value_list, when, default_max_value_len);` |
| 1641 | | pub fn allocNextIntoArrayList(self: *@This(), value_list: *std.array_list.Managed(u8), when: AllocWhen) Reader.AllocError!?[]const u8 { |
| 1642 | | return self.allocNextIntoArrayListMax(value_list, when, default_max_value_len); |
| 1639 | pub fn allocNextIntoArrayList(self: *@This(), allocator: Allocator, value_list: *std.ArrayList(u8), when: AllocWhen) Reader.AllocError!?[]const u8 { |
| 1640 | return self.allocNextIntoArrayListMax(allocator, value_list, when, default_max_value_len); |
| 1643 | 1641 | } |
| 1644 | 1642 | /// Calls `std.json.Scanner.allocNextIntoArrayListMax` and handles `error.BufferUnderrun`. |
| 1645 | | pub fn allocNextIntoArrayListMax(self: *@This(), value_list: *std.array_list.Managed(u8), when: AllocWhen, max_value_len: usize) Reader.AllocError!?[]const u8 { |
| 1643 | pub fn allocNextIntoArrayListMax( |
| 1644 | self: *@This(), |
| 1645 | allocator: Allocator, |
| 1646 | value_list: *std.ArrayList(u8), |
| 1647 | when: AllocWhen, |
| 1648 | max_value_len: usize, |
| 1649 | ) Reader.AllocError!?[]const u8 { |
| 1646 | 1650 | while (true) { |
| 1647 | | return self.scanner.allocNextIntoArrayListMax(value_list, when, max_value_len) catch |err| switch (err) { |
| 1651 | return self.scanner.allocNextIntoArrayListMax(allocator, value_list, when, max_value_len) catch |err| switch (err) { |
| 1648 | 1652 | error.BufferUnderrun => { |
| 1649 | 1653 | try self.refillBuffer(); |
| 1650 | 1654 | continue; |
| ... | ... | @@ -1745,10 +1749,10 @@ pub const Reader = struct { |
| 1745 | 1749 | const OBJECT_MODE = 0; |
| 1746 | 1750 | const ARRAY_MODE = 1; |
| 1747 | 1751 | |
| 1748 | | fn appendSlice(list: *std.array_list.Managed(u8), buf: []const u8, max_value_len: usize) !void { |
| 1752 | fn appendSlice(allocator: Allocator, list: *std.ArrayList(u8), buf: []const u8, max_value_len: usize) !void { |
| 1749 | 1753 | const new_len = std.math.add(usize, list.items.len, buf.len) catch return error.ValueTooLong; |
| 1750 | 1754 | if (new_len > max_value_len) return error.ValueTooLong; |
| 1751 | | try list.appendSlice(buf); |
| 1755 | try list.appendSlice(allocator, buf); |
| 1752 | 1756 | } |
| 1753 | 1757 | |
| 1754 | 1758 | /// For the slice you get from a `Token.number` or `Token.allocated_number`, |