Skip to content

Commit c40fb96

Browse files
committed
std.Io.Writer: fix writeSliceSwap
tried to be too clever, wrote bad code
1 parent 741a66e commit c40fb96

File tree

7 files changed

+35
-46
lines changed

7 files changed

+35
-46
lines changed

lib/compiler/test_runner.zig

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ pub const std_options: std.Options = .{
1010
};
1111

1212
var log_err_count: usize = 0;
13-
var fba_buffer: [8192]u8 = undefined;
1413
var fba = std.heap.FixedBufferAllocator.init(&fba_buffer);
15-
var stdin_buffer: [std.heap.page_size_min]u8 align(std.heap.page_size_min) = undefined;
16-
var stdout_buffer: [std.heap.page_size_min]u8 align(std.heap.page_size_min) = undefined;
14+
var fba_buffer: [8192]u8 = undefined;
15+
var stdin_buffer: [4096]u8 = undefined;
16+
var stdout_buffer: [4096]u8 = undefined;
1717

1818
const crippled = switch (builtin.zig_backend) {
1919
.stage2_powerpc,
@@ -68,8 +68,8 @@ pub fn main() void {
6868

6969
fn mainServer() !void {
7070
@disableInstrumentation();
71-
var stdin_reader = std.fs.File.stdin().reader(&stdin_buffer);
72-
var stdout_writer = std.fs.File.stdout().writer(&stdout_buffer);
71+
var stdin_reader = std.fs.File.stdin().readerStreaming(&stdin_buffer);
72+
var stdout_writer = std.fs.File.stdout().writerStreaming(&stdout_buffer);
7373
var server = try std.zig.Server.init(.{
7474
.in = &stdin_reader.interface,
7575
.out = &stdout_writer.interface,
@@ -104,7 +104,7 @@ fn mainServer() !void {
104104
defer testing.allocator.free(expected_panic_msgs);
105105

106106
for (test_fns, names, expected_panic_msgs) |test_fn, *name, *expected_panic_msg| {
107-
name.* = @as(u32, @intCast(string_bytes.items.len));
107+
name.* = @intCast(string_bytes.items.len);
108108
try string_bytes.ensureUnusedCapacity(testing.allocator, test_fn.name.len + 1);
109109
string_bytes.appendSliceAssumeCapacity(test_fn.name);
110110
string_bytes.appendAssumeCapacity(0);

lib/std/Build/Step/Run.zig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1742,7 +1742,7 @@ fn sendMessage(file: std.fs.File, tag: std.zig.Client.Message.Tag) !void {
17421742
.tag = tag,
17431743
.bytes_len = 0,
17441744
};
1745-
try file.writeAll(std.mem.asBytes(&header));
1745+
try file.writeAll(@ptrCast(&header));
17461746
}
17471747

17481748
fn sendRunTestMessage(file: std.fs.File, tag: std.zig.Client.Message.Tag, index: u32) !void {

lib/std/Io/Reader.zig

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1108,9 +1108,9 @@ pub fn takeVarInt(r: *Reader, comptime Int: type, endian: std.builtin.Endian, n:
11081108
/// Asserts the buffer was initialized with a capacity at least `@sizeOf(T)`.
11091109
///
11101110
/// See also:
1111-
/// * `peekStructReference`
1111+
/// * `peekStructPointer`
11121112
/// * `takeStruct`
1113-
pub fn takeStructReference(r: *Reader, comptime T: type) Error!*align(1) T {
1113+
pub fn takeStructPointer(r: *Reader, comptime T: type) Error!*align(1) T {
11141114
// Only extern and packed structs have defined in-memory layout.
11151115
comptime assert(@typeInfo(T).@"struct".layout != .auto);
11161116
return @ptrCast(try r.takeArray(@sizeOf(T)));
@@ -1122,9 +1122,9 @@ pub fn takeStructReference(r: *Reader, comptime T: type) Error!*align(1) T {
11221122
/// Asserts the buffer was initialized with a capacity at least `@sizeOf(T)`.
11231123
///
11241124
/// See also:
1125-
/// * `takeStructReference`
1125+
/// * `takeStructPointer`
11261126
/// * `peekStruct`
1127-
pub fn peekStructReference(r: *Reader, comptime T: type) Error!*align(1) T {
1127+
pub fn peekStructPointer(r: *Reader, comptime T: type) Error!*align(1) T {
11281128
// Only extern and packed structs have defined in-memory layout.
11291129
comptime assert(@typeInfo(T).@"struct".layout != .auto);
11301130
return @ptrCast(try r.peekArray(@sizeOf(T)));
@@ -1136,14 +1136,14 @@ pub fn peekStructReference(r: *Reader, comptime T: type) Error!*align(1) T {
11361136
/// when `endian` is comptime-known and matches the host endianness.
11371137
///
11381138
/// See also:
1139-
/// * `takeStructReference`
1139+
/// * `takeStructPointer`
11401140
/// * `peekStruct`
11411141
pub inline fn takeStruct(r: *Reader, comptime T: type, endian: std.builtin.Endian) Error!T {
11421142
switch (@typeInfo(T)) {
11431143
.@"struct" => |info| switch (info.layout) {
11441144
.auto => @compileError("ill-defined memory layout"),
11451145
.@"extern" => {
1146-
var res = (try r.takeStructReference(T)).*;
1146+
var res = (try r.takeStructPointer(T)).*;
11471147
if (native_endian != endian) std.mem.byteSwapAllFields(T, &res);
11481148
return res;
11491149
},
@@ -1162,13 +1162,13 @@ pub inline fn takeStruct(r: *Reader, comptime T: type, endian: std.builtin.Endia
11621162
///
11631163
/// See also:
11641164
/// * `takeStruct`
1165-
/// * `peekStructReference`
1165+
/// * `peekStructPointer`
11661166
pub inline fn peekStruct(r: *Reader, comptime T: type, endian: std.builtin.Endian) Error!T {
11671167
switch (@typeInfo(T)) {
11681168
.@"struct" => |info| switch (info.layout) {
11691169
.auto => @compileError("ill-defined memory layout"),
11701170
.@"extern" => {
1171-
var res = (try r.peekStructReference(T)).*;
1171+
var res = (try r.peekStructPointer(T)).*;
11721172
if (native_endian != endian) std.mem.byteSwapAllFields(T, &res);
11731173
return res;
11741174
},
@@ -1557,27 +1557,27 @@ test takeVarInt {
15571557
try testing.expectError(error.EndOfStream, r.takeVarInt(u16, .little, 1));
15581558
}
15591559

1560-
test takeStructReference {
1560+
test takeStructPointer {
15611561
var r: Reader = .fixed(&.{ 0x12, 0x00, 0x34, 0x56 });
15621562
const S = extern struct { a: u8, b: u16 };
15631563
switch (native_endian) {
1564-
.little => try testing.expectEqual(@as(S, .{ .a = 0x12, .b = 0x5634 }), (try r.takeStructReference(S)).*),
1565-
.big => try testing.expectEqual(@as(S, .{ .a = 0x12, .b = 0x3456 }), (try r.takeStructReference(S)).*),
1564+
.little => try testing.expectEqual(@as(S, .{ .a = 0x12, .b = 0x5634 }), (try r.takeStructPointer(S)).*),
1565+
.big => try testing.expectEqual(@as(S, .{ .a = 0x12, .b = 0x3456 }), (try r.takeStructPointer(S)).*),
15661566
}
1567-
try testing.expectError(error.EndOfStream, r.takeStructReference(S));
1567+
try testing.expectError(error.EndOfStream, r.takeStructPointer(S));
15681568
}
15691569

1570-
test peekStructReference {
1570+
test peekStructPointer {
15711571
var r: Reader = .fixed(&.{ 0x12, 0x00, 0x34, 0x56 });
15721572
const S = extern struct { a: u8, b: u16 };
15731573
switch (native_endian) {
15741574
.little => {
1575-
try testing.expectEqual(@as(S, .{ .a = 0x12, .b = 0x5634 }), (try r.peekStructReference(S)).*);
1576-
try testing.expectEqual(@as(S, .{ .a = 0x12, .b = 0x5634 }), (try r.peekStructReference(S)).*);
1575+
try testing.expectEqual(@as(S, .{ .a = 0x12, .b = 0x5634 }), (try r.peekStructPointer(S)).*);
1576+
try testing.expectEqual(@as(S, .{ .a = 0x12, .b = 0x5634 }), (try r.peekStructPointer(S)).*);
15771577
},
15781578
.big => {
1579-
try testing.expectEqual(@as(S, .{ .a = 0x12, .b = 0x3456 }), (try r.peekStructReference(S)).*);
1580-
try testing.expectEqual(@as(S, .{ .a = 0x12, .b = 0x3456 }), (try r.peekStructReference(S)).*);
1579+
try testing.expectEqual(@as(S, .{ .a = 0x12, .b = 0x3456 }), (try r.peekStructPointer(S)).*);
1580+
try testing.expectEqual(@as(S, .{ .a = 0x12, .b = 0x3456 }), (try r.peekStructPointer(S)).*);
15811581
},
15821582
}
15831583
}

lib/std/Io/Writer.zig

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -851,9 +851,6 @@ pub inline fn writeStruct(w: *Writer, value: anytype, endian: std.builtin.Endian
851851
}
852852
}
853853

854-
/// If, `endian` is not native,
855-
/// * Asserts that the buffer storage capacity is at least enough to store `@sizeOf(Elem)`
856-
/// * Asserts that the buffer is aligned enough for `@alignOf(Elem)`.
857854
pub inline fn writeSliceEndian(
858855
w: *Writer,
859856
Elem: type,
@@ -867,18 +864,11 @@ pub inline fn writeSliceEndian(
867864
}
868865
}
869866

870-
/// Asserts that the buffer storage capacity is at least enough to store `@sizeOf(Elem)`
871-
///
872-
/// Asserts that the buffer is aligned enough for `@alignOf(Elem)`.
873867
pub fn writeSliceSwap(w: *Writer, Elem: type, slice: []const Elem) Error!void {
874-
var i: usize = 0;
875-
while (i < slice.len) {
876-
const dest_bytes = try w.writableSliceGreedy(@sizeOf(Elem));
877-
const dest: []Elem = @alignCast(@ptrCast(dest_bytes[0 .. dest_bytes.len - dest_bytes.len % @sizeOf(Elem)]));
878-
const copy_len = @min(dest.len, slice.len - i);
879-
@memcpy(dest[0..copy_len], slice[i..][0..copy_len]);
880-
i += copy_len;
881-
std.mem.byteSwapAllElements(Elem, dest);
868+
for (slice) |elem| {
869+
var tmp = elem;
870+
std.mem.byteSwapAllFields(Elem, &tmp);
871+
try w.writeAll(@ptrCast(&tmp));
882872
}
883873
}
884874

@@ -2650,9 +2640,10 @@ test writeStruct {
26502640
}
26512641

26522642
test writeSliceEndian {
2653-
var buffer: [4]u8 align(2) = undefined;
2643+
var buffer: [5]u8 align(2) = undefined;
26542644
var w: Writer = .fixed(&buffer);
2645+
try w.writeByte('x');
26552646
const array: [2]u16 = .{ 0x1234, 0x5678 };
26562647
try writeSliceEndian(&w, u16, &array, .big);
2657-
try testing.expectEqualSlices(u8, &.{ 0x12, 0x34, 0x56, 0x78 }, &buffer);
2648+
try testing.expectEqualSlices(u8, &.{ 'x', 0x12, 0x34, 0x56, 0x78 }, &buffer);
26582649
}

lib/std/zig/Server.zig

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,6 @@ pub fn init(options: Options) !Server {
118118
.in = options.in,
119119
.out = options.out,
120120
};
121-
assert(s.out.buffer.len >= 4);
122-
std.debug.assertAligned(s.out.buffer.ptr, .@"4");
123121
try s.serveStringMessage(.zig_version, options.zig_version);
124122
return s;
125123
}
@@ -203,8 +201,8 @@ pub const TestMetadata = struct {
203201

204202
pub fn serveTestMetadata(s: *Server, test_metadata: TestMetadata) !void {
205203
const header: OutMessage.TestMetadata = .{
206-
.tests_len = @as(u32, @intCast(test_metadata.names.len)),
207-
.string_bytes_len = @as(u32, @intCast(test_metadata.string_bytes.len)),
204+
.tests_len = @intCast(test_metadata.names.len),
205+
.string_bytes_len = @intCast(test_metadata.string_bytes.len),
208206
};
209207
const trailing = 2;
210208
const bytes_len = @sizeOf(OutMessage.TestMetadata) +

src/Zcu.zig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2821,7 +2821,7 @@ pub fn loadZirCache(gpa: Allocator, cache_file: std.fs.File) !Zir {
28212821
var buffer: [2000]u8 = undefined;
28222822
var file_reader = cache_file.reader(&buffer);
28232823
return result: {
2824-
const header = file_reader.interface.takeStructReference(Zir.Header) catch |err| break :result err;
2824+
const header = file_reader.interface.takeStructPointer(Zir.Header) catch |err| break :result err;
28252825
break :result loadZirCacheBody(gpa, header.*, &file_reader.interface);
28262826
} catch |err| switch (err) {
28272827
error.ReadFailed => return file_reader.err.?,

src/Zcu/PerThread.zig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ fn loadZirZoirCache(
349349
const cache_br = &cache_fr.interface;
350350

351351
// First we read the header to determine the lengths of arrays.
352-
const header = (cache_br.takeStructReference(Header) catch |err| switch (err) {
352+
const header = (cache_br.takeStructPointer(Header) catch |err| switch (err) {
353353
error.ReadFailed => return cache_fr.err.?,
354354
// This can happen if Zig bails out of this function between creating
355355
// the cached file and writing it.

0 commit comments

Comments
 (0)