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

This commit is contained in:
Andrew Kelley 2025-06-25 10:41:32 -07:00
parent c27ab8b45d
commit 7d6b5ed510
2 changed files with 4 additions and 6 deletions

View File

@ -313,9 +313,8 @@ pub fn readVecLimit(r: *Reader, data: []const []u8, limit: Limit) Error!usize {
.last = r.buffer,
},
.writer = .{
.context = &Writer.VectorWrapper.unique_address,
.buffer = if (first.len >= r.buffer.len) first else r.buffer,
.vtable = &.{ .drain = Writer.fixedDrain },
.vtable = &Writer.VectorWrapper.vtable,
},
};
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 {
.last = r.buffer,
},
.writer = .{
.context = &Writer.VectorWrapper.unique_address,
.buffer = if (remaining.len >= r.buffer.len) remaining else r.buffer,
.vtable = &.{ .drain = Writer.fixedDrain },
.vtable = &Writer.VectorWrapper.vtable,
},
};
const n = r.vtable.stream(r, &wrapper.writer, .unlimited) catch |err| switch (err) {

View File

@ -333,11 +333,11 @@ pub const WritableVectorIterator = struct {
pub const VectorWrapper = struct {
writer: Writer,
it: WritableVectorIterator,
pub var unique_address: u8 = undefined;
pub const vtable: VTable = .{ .drain = fixedDrain };
};
pub fn writableVectorIterator(w: *Writer) Error!WritableVectorIterator {
if (@as(*u8, @ptrCast(w.context)) == &VectorWrapper.unique_address) {
if (w.vtable == &VectorWrapper.vtable) {
const wrapper: *VectorWrapper = @fieldParentPtr("writer", w);
return wrapper.it;
}