| ... | ... | @@ -279,14 +279,6 @@ pub fn readVec(r: *Reader, data: []const []u8) Error!usize { |
| 279 | 279 | return readVec(r, data, .unlimited); |
| 280 | 280 | } |
| 281 | 281 | |
| 282 | | const VectorWrapped = struct { |
| 283 | | writer: Writer, |
| 284 | | first: []u8, |
| 285 | | middle: []const []u8, |
| 286 | | last: []u8, |
| 287 | | var unique_address: u8 = undefined; |
| 288 | | }; |
| 289 | | |
| 290 | 282 | /// Equivalent to `readVec` but reads at most `limit` bytes. |
| 291 | 283 | /// |
| 292 | 284 | /// This ultimately will lower to a call to `stream`, but it must ensure |
| ... | ... | @@ -313,29 +305,32 @@ pub fn readVecLimit(r: *Reader, data: []const []u8, limit: Limit) Error!usize { |
| 313 | 305 | r.seek = 0; |
| 314 | 306 | r.end = 0; |
| 315 | 307 | const first = buf[copy_len..]; |
| 316 | | var wrapped: VectorWrapped = .{ |
| 317 | | .first = first, |
| 318 | | .middle = data[i + 1 ..], |
| 319 | | .last = r.buffer, |
| 308 | const middle = data[i + 1 ..]; |
| 309 | var wrapper: Writer.VectorWrapper = .{ |
| 310 | .it = .{ |
| 311 | .first = first, |
| 312 | .middle = middle, |
| 313 | .last = r.buffer, |
| 314 | }, |
| 320 | 315 | .writer = .{ |
| 321 | | .context = &VectorWrapped.unique_address, |
| 316 | .context = &Writer.VectorWrapper.unique_address, |
| 322 | 317 | .buffer = if (first.len >= r.buffer.len) first else r.buffer, |
| 323 | 318 | .vtable = &.{ .drain = Writer.fixedDrain }, |
| 324 | 319 | }, |
| 325 | 320 | }; |
| 326 | | var n = r.vtable.stream(r, &wrapped.writer, .limited(remaining)) catch |err| switch (err) { |
| 321 | var n = r.vtable.stream(r, &wrapper.writer, .limited(remaining)) catch |err| switch (err) { |
| 327 | 322 | error.WriteFailed => { |
| 328 | | if (wrapped.writer.buffer.ptr == first.ptr) { |
| 329 | | remaining -= wrapped.writer.end; |
| 323 | if (wrapper.writer.buffer.ptr == first.ptr) { |
| 324 | remaining -= wrapper.writer.end; |
| 330 | 325 | } else { |
| 331 | | r.end = wrapped.writer.end; |
| 326 | r.end = wrapper.writer.end; |
| 332 | 327 | } |
| 333 | 328 | break; |
| 334 | 329 | }, |
| 335 | 330 | else => |e| return e, |
| 336 | 331 | }; |
| 337 | | assert(n == wrapped.writer.end); |
| 338 | | if (wrapped.writer.buffer.ptr != first.ptr) { |
| 332 | assert(n == wrapper.writer.end); |
| 333 | if (wrapper.writer.buffer.ptr != first.ptr) { |
| 339 | 334 | r.end = n; |
| 340 | 335 | break; |
| 341 | 336 | } |
| ... | ... | @@ -345,13 +340,13 @@ pub fn readVecLimit(r: *Reader, data: []const []u8, limit: Limit) Error!usize { |
| 345 | 340 | } |
| 346 | 341 | remaining -= first.len; |
| 347 | 342 | n -= first.len; |
| 348 | | for (wrapped.middle) |middle| { |
| 349 | | if (n < middle.len) { |
| 343 | for (middle) |mid| { |
| 344 | if (n < mid.len) { |
| 350 | 345 | remaining -= n; |
| 351 | 346 | break; |
| 352 | 347 | } |
| 353 | | remaining -= middle.len; |
| 354 | | n -= middle.len; |
| 348 | remaining -= mid.len; |
| 349 | n -= mid.len; |
| 355 | 350 | } |
| 356 | 351 | r.end = n; |
| 357 | 352 | break; |