mirror of
https://github.com/ziglang/zig.git
synced 2026-01-20 22:35:24 +00:00
std.io.Writer.VectorWrapper: fix vtable not being a unique addr
This commit is contained in:
parent
a983f5b90f
commit
043079d765
@ -323,7 +323,7 @@ pub fn readVecLimit(r: *Reader, data: []const []u8, limit: Limit) Error!usize {
|
||||
},
|
||||
.writer = .{
|
||||
.buffer = if (first.len >= r.buffer.len) first else r.buffer,
|
||||
.vtable = &Writer.VectorWrapper.vtable,
|
||||
.vtable = Writer.VectorWrapper.vtable,
|
||||
},
|
||||
};
|
||||
var n = r.vtable.stream(r, &wrapper.writer, .limited(remaining)) catch |err| switch (err) {
|
||||
@ -599,7 +599,7 @@ pub fn readSliceShort(r: *Reader, buffer: []u8) ShortError!usize {
|
||||
},
|
||||
.writer = .{
|
||||
.buffer = if (remaining.len >= r.buffer.len) remaining else r.buffer,
|
||||
.vtable = &Writer.VectorWrapper.vtable,
|
||||
.vtable = Writer.VectorWrapper.vtable,
|
||||
},
|
||||
};
|
||||
const n = r.vtable.stream(r, &wrapper.writer, .unlimited) catch |err| switch (err) {
|
||||
|
||||
@ -392,11 +392,14 @@ pub const VectorWrapper = struct {
|
||||
it: WritableVectorIterator,
|
||||
/// Tracks whether the "writable vector" API was used.
|
||||
used: bool = false,
|
||||
pub const vtable: VTable = .{ .drain = fixedDrain };
|
||||
pub const vtable: *const VTable = &unique_vtable_allocation;
|
||||
/// This is intended to be constant but it must be a unique address for
|
||||
/// `@fieldParentPtr` to work.
|
||||
var unique_vtable_allocation: VTable = .{ .drain = fixedDrain };
|
||||
};
|
||||
|
||||
pub fn writableVectorIterator(w: *Writer) Error!WritableVectorIterator {
|
||||
if (w.vtable == &VectorWrapper.vtable) {
|
||||
if (w.vtable == VectorWrapper.vtable) {
|
||||
const wrapper: *VectorWrapper = @fieldParentPtr("writer", w);
|
||||
wrapper.used = true;
|
||||
return wrapper.it;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user