authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-29 18:18:49-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-29 23:10:50-07:00
log1fcaf90dd3c99d452fcab13698a63faf17e8f3c1
treef8ab000e6f06739310890b562b7c024b9ae4df74
parent8414638fb878febc9da2e956696d591c26fed101

std.Io.Reader: make fillUnbuffered respect prexisting buffer

addresses only one usage pattern in #24608

2 files changed, 2 insertions(+), 12 deletions(-)

lib/std/Io/Reader.zig-9
...@@ -1055,15 +1055,6 @@ pub fn fill(r: *Reader, n: usize) Error!void {...@@ -1055,15 +1055,6 @@ pub fn fill(r: *Reader, n: usize) Error!void {
1055/// Missing this optimization can result in wall-clock time for the most affected benchmarks1055/// Missing this optimization can result in wall-clock time for the most affected benchmarks
1056/// increasing by a factor of 5 or more.1056/// increasing by a factor of 5 or more.
1057fn fillUnbuffered(r: *Reader, n: usize) Error!void {1057fn fillUnbuffered(r: *Reader, n: usize) Error!void {
1058 if (r.seek + n <= r.buffer.len) while (true) {
1059 const end_cap = r.buffer[r.end..];
1060 var writer: Writer = .fixed(end_cap);
1061 r.end += r.vtable.stream(r, &writer, .limited(end_cap.len)) catch |err| switch (err) {
1062 error.WriteFailed => unreachable,
1063 else => |e| return e,
1064 };
1065 if (r.seek + n <= r.end) return;
1066 };
1067 try rebase(r, n);1058 try rebase(r, n);
1068 var writer: Writer = .{1059 var writer: Writer = .{
1069 .buffer = r.buffer,1060 .buffer = r.buffer,
lib/std/compress/zstd/Decompress.zig+2-3
...@@ -100,9 +100,8 @@ fn rebase(r: *Reader, capacity: usize) Reader.RebaseError!void {...@@ -100,9 +100,8 @@ fn rebase(r: *Reader, capacity: usize) Reader.RebaseError!void {
100 const d: *Decompress = @alignCast(@fieldParentPtr("reader", r));100 const d: *Decompress = @alignCast(@fieldParentPtr("reader", r));
101 assert(capacity <= r.buffer.len - d.window_len);101 assert(capacity <= r.buffer.len - d.window_len);
102 assert(r.end + capacity > r.buffer.len);102 assert(r.end + capacity > r.buffer.len);
103 const buffered = r.buffer[0..r.end];103 const discard = r.end - d.window_len;
104 const discard = buffered.len - d.window_len;104 const keep = r.buffer[discard..r.end];
105 const keep = buffered[discard..];
106 @memmove(r.buffer[0..keep.len], keep);105 @memmove(r.buffer[0..keep.len], keep);
107 r.end = keep.len;106 r.end = keep.len;
108 r.seek -= discard;107 r.seek -= discard;