Commit 043079d765

Andrew Kelley <andrew@ziglang.org>
2025-07-08 06:47:32
std.io.Writer.VectorWrapper: fix vtable not being a unique addr
1 parent a983f5b
Changed files (2)
lib/std/io/Reader.zig
@@ -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) {
lib/std/io/Writer.zig
@@ -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;