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