authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-09 18:38:46-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-09 20:01:15-07:00
log55bced9563daba677bd71c3f93df774092fb2205
tree6dc8d14d78949e880c442c43660395fac356d3c5
parent9e52febeebe2a5554e67a961476e19aa01268cb4

std.fs.File.Writer: fix splat alias bug

same deal as previous commit

1 files changed, 11 insertions(+), 13 deletions(-)

lib/std/fs/File.zig+11-13
......@@ -1728,25 +1728,22 @@ pub const Writer = struct {
17281728 iovecs[len] = .{ .base = buffered.ptr, .len = buffered.len };
17291729 len += 1;
17301730 }
1731 for (data) |d| {
1731 for (data[0 .. data.len - 1]) |d| {
17321732 if (d.len == 0) continue;
17331733 iovecs[len] = .{ .base = d.ptr, .len = d.len };
17341734 len += 1;
17351735 if (iovecs.len - len == 0) break;
17361736 }
1737 if (len == 0) return 0;
17381737 const pattern = data[data.len - 1];
1739 switch (splat) {
1740 0 => if (iovecs[len - 1].base == pattern.ptr) {
1741 len -= 1;
1738 if (iovecs.len - len != 0) switch (splat) {
1739 0 => {},
1740 1 => if (pattern.len != 0) {
1741 iovecs[len] = .{ .base = pattern.ptr, .len = pattern.len };
1742 len += 1;
17421743 },
1743 1 => {},
17441744 else => switch (pattern.len) {
17451745 0 => {},
1746 1 => memset: {
1747 // Replace the 1-byte buffer with a bigger one.
1748 if (iovecs[len - 1].base == pattern.ptr) len -= 1;
1749 if (iovecs.len - len == 0) break :memset;
1746 1 => {
17501747 const splat_buffer_candidate = io_w.buffer[io_w.end..];
17511748 var backup_buffer: [64]u8 = undefined;
17521749 const splat_buffer = if (splat_buffer_candidate.len >= backup_buffer.len)
......@@ -1770,13 +1767,14 @@ pub const Writer = struct {
17701767 len += 1;
17711768 }
17721769 },
1773 else => for (0..splat - 1) |_| {
1774 if (iovecs.len - len == 0) break;
1770 else => for (0..splat) |_| {
17751771 iovecs[len] = .{ .base = pattern.ptr, .len = pattern.len };
17761772 len += 1;
1773 if (iovecs.len - len == 0) break;
17771774 },
17781775 },
1779 }
1776 };
1777 if (len == 0) return 0;
17801778 switch (w.mode) {
17811779 .positional, .positional_reading => {
17821780 const n = std.posix.pwritev(handle, iovecs[0..len], w.pos) catch |err| switch (err) {