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 {...@@ -1728,25 +1728,22 @@ pub const Writer = struct {
1728 iovecs[len] = .{ .base = buffered.ptr, .len = buffered.len };1728 iovecs[len] = .{ .base = buffered.ptr, .len = buffered.len };
1729 len += 1;1729 len += 1;
1730 }1730 }
1731 for (data) |d| {1731 for (data[0 .. data.len - 1]) |d| {
1732 if (d.len == 0) continue;1732 if (d.len == 0) continue;
1733 iovecs[len] = .{ .base = d.ptr, .len = d.len };1733 iovecs[len] = .{ .base = d.ptr, .len = d.len };
1734 len += 1;1734 len += 1;
1735 if (iovecs.len - len == 0) break;1735 if (iovecs.len - len == 0) break;
1736 }1736 }
1737 if (len == 0) return 0;
1738 const pattern = data[data.len - 1];1737 const pattern = data[data.len - 1];
1739 switch (splat) {1738 if (iovecs.len - len != 0) switch (splat) {
1740 0 => if (iovecs[len - 1].base == pattern.ptr) {1739 0 => {},
1741 len -= 1;1740 1 => if (pattern.len != 0) {
1741 iovecs[len] = .{ .base = pattern.ptr, .len = pattern.len };
1742 len += 1;
1742 },1743 },
1743 1 => {},
1744 else => switch (pattern.len) {1744 else => switch (pattern.len) {
1745 0 => {},1745 0 => {},
1746 1 => memset: {1746 1 => {
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;
1750 const splat_buffer_candidate = io_w.buffer[io_w.end..];1747 const splat_buffer_candidate = io_w.buffer[io_w.end..];
1751 var backup_buffer: [64]u8 = undefined;1748 var backup_buffer: [64]u8 = undefined;
1752 const splat_buffer = if (splat_buffer_candidate.len >= backup_buffer.len)1749 const splat_buffer = if (splat_buffer_candidate.len >= backup_buffer.len)
...@@ -1770,13 +1767,14 @@ pub const Writer = struct {...@@ -1770,13 +1767,14 @@ pub const Writer = struct {
1770 len += 1;1767 len += 1;
1771 }1768 }
1772 },1769 },
1773 else => for (0..splat - 1) |_| {1770 else => for (0..splat) |_| {
1774 if (iovecs.len - len == 0) break;
1775 iovecs[len] = .{ .base = pattern.ptr, .len = pattern.len };1771 iovecs[len] = .{ .base = pattern.ptr, .len = pattern.len };
1776 len += 1;1772 len += 1;
1773 if (iovecs.len - len == 0) break;
1777 },1774 },
1778 },1775 },
1779 }1776 };
1777 if (len == 0) return 0;
1780 switch (w.mode) {1778 switch (w.mode) {
1781 .positional, .positional_reading => {1779 .positional, .positional_reading => {
1782 const n = std.posix.pwritev(handle, iovecs[0..len], w.pos) catch |err| switch (err) {1780 const n = std.posix.pwritev(handle, iovecs[0..len], w.pos) catch |err| switch (err) {