authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-06-25 10:41:32-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-01 16:35:30-07:00
log7d6b5ed5103e6a06d1bd8be884f6c2a7ecb0e09a
tree35c27ebb376df4fe6c04965cb4aa733b4901d2e6
parentc27ab8b45d767388eba5c3e69fc4b4764ae5e1c4

std.io: Reader and Writer check vtable ptr rather than context


2 files changed, 4 insertions(+), 6 deletions(-)

lib/std/io/Reader.zig+2-4
...@@ -313,9 +313,8 @@ pub fn readVecLimit(r: *Reader, data: []const []u8, limit: Limit) Error!usize {...@@ -313,9 +313,8 @@ pub fn readVecLimit(r: *Reader, data: []const []u8, limit: Limit) Error!usize {
313 .last = r.buffer,313 .last = r.buffer,
314 },314 },
315 .writer = .{315 .writer = .{
316 .context = &Writer.VectorWrapper.unique_address,
317 .buffer = if (first.len >= r.buffer.len) first else r.buffer,316 .buffer = if (first.len >= r.buffer.len) first else r.buffer,
318 .vtable = &.{ .drain = Writer.fixedDrain },317 .vtable = &Writer.VectorWrapper.vtable,
319 },318 },
320 };319 };
321 var n = r.vtable.stream(r, &wrapper.writer, .limited(remaining)) catch |err| switch (err) {320 var n = r.vtable.stream(r, &wrapper.writer, .limited(remaining)) catch |err| switch (err) {
...@@ -591,9 +590,8 @@ pub fn readSliceShort(r: *Reader, buffer: []u8) ShortError!usize {...@@ -591,9 +590,8 @@ pub fn readSliceShort(r: *Reader, buffer: []u8) ShortError!usize {
591 .last = r.buffer,590 .last = r.buffer,
592 },591 },
593 .writer = .{592 .writer = .{
594 .context = &Writer.VectorWrapper.unique_address,
595 .buffer = if (remaining.len >= r.buffer.len) remaining else r.buffer,593 .buffer = if (remaining.len >= r.buffer.len) remaining else r.buffer,
596 .vtable = &.{ .drain = Writer.fixedDrain },594 .vtable = &Writer.VectorWrapper.vtable,
597 },595 },
598 };596 };
599 const n = r.vtable.stream(r, &wrapper.writer, .unlimited) catch |err| switch (err) {597 const n = r.vtable.stream(r, &wrapper.writer, .unlimited) catch |err| switch (err) {
lib/std/io/Writer.zig+2-2
...@@ -333,11 +333,11 @@ pub const WritableVectorIterator = struct {...@@ -333,11 +333,11 @@ pub const WritableVectorIterator = struct {
333pub const VectorWrapper = struct {333pub const VectorWrapper = struct {
334 writer: Writer,334 writer: Writer,
335 it: WritableVectorIterator,335 it: WritableVectorIterator,
336 pub var unique_address: u8 = undefined;336 pub const vtable: VTable = .{ .drain = fixedDrain };
337};337};
338338
339pub fn writableVectorIterator(w: *Writer) Error!WritableVectorIterator {339pub fn writableVectorIterator(w: *Writer) Error!WritableVectorIterator {
340 if (@as(*u8, @ptrCast(w.context)) == &VectorWrapper.unique_address) {340 if (w.vtable == &VectorWrapper.vtable) {
341 const wrapper: *VectorWrapper = @fieldParentPtr("writer", w);341 const wrapper: *VectorWrapper = @fieldParentPtr("writer", w);
342 return wrapper.it;342 return wrapper.it;
343 }343 }