Skip to content

Commit 8373788

Browse files
authored
Merge pull request #24488 from ziglang/more
std.zig: finish updating to new I/O API
2 parents 4780cc5 + c40fb96 commit 8373788

23 files changed

+275
-595
lines changed

lib/compiler/objcopy.zig

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ const assert = std.debug.assert;
1010
const fatal = std.process.fatal;
1111
const Server = std.zig.Server;
1212

13+
var stdin_buffer: [1024]u8 = undefined;
14+
var stdout_buffer: [1024]u8 = undefined;
15+
1316
pub fn main() !void {
1417
var arena_instance = std.heap.ArenaAllocator.init(std.heap.page_allocator);
1518
defer arena_instance.deinit();
@@ -22,11 +25,8 @@ pub fn main() !void {
2225
return cmdObjCopy(gpa, arena, args[1..]);
2326
}
2427

25-
fn cmdObjCopy(
26-
gpa: Allocator,
27-
arena: Allocator,
28-
args: []const []const u8,
29-
) !void {
28+
fn cmdObjCopy(gpa: Allocator, arena: Allocator, args: []const []const u8) !void {
29+
_ = gpa;
3030
var i: usize = 0;
3131
var opt_out_fmt: ?std.Target.ObjectFormat = null;
3232
var opt_input: ?[]const u8 = null;
@@ -225,13 +225,13 @@ fn cmdObjCopy(
225225
}
226226

227227
if (listen) {
228+
var stdin_reader = fs.File.stdin().reader(&stdin_buffer);
229+
var stdout_writer = fs.File.stdout().writer(&stdout_buffer);
228230
var server = try Server.init(.{
229-
.gpa = gpa,
230-
.in = .stdin(),
231-
.out = .stdout(),
231+
.in = &stdin_reader.interface,
232+
.out = &stdout_writer.interface,
232233
.zig_version = builtin.zig_version_string,
233234
});
234-
defer server.deinit();
235235

236236
var seen_update = false;
237237
while (true) {

lib/compiler/resinator/main.zig

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ const hasDisjointCodePage = @import("disjoint_code_page.zig").hasDisjointCodePag
1313
const fmtResourceType = @import("res.zig").NameOrOrdinal.fmtResourceType;
1414
const aro = @import("aro");
1515

16+
var stdout_buffer: [1024]u8 = undefined;
17+
1618
pub fn main() !void {
1719
var gpa: std.heap.GeneralPurposeAllocator(.{}) = .init;
1820
defer std.debug.assert(gpa.deinit() == .ok);
@@ -41,12 +43,12 @@ pub fn main() !void {
4143
cli_args = args[3..];
4244
}
4345

46+
var stdout_writer2 = std.fs.File.stdout().writer(&stdout_buffer);
4447
var error_handler: ErrorHandler = switch (zig_integration) {
4548
true => .{
4649
.server = .{
47-
.out = std.fs.File.stdout(),
50+
.out = &stdout_writer2.interface,
4851
.in = undefined, // won't be receiving messages
49-
.receive_fifo = undefined, // won't be receiving messages
5052
},
5153
},
5254
false => .{

lib/compiler/test_runner.zig

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
const builtin = @import("builtin");
33

44
const std = @import("std");
5-
const io = std.io;
65
const testing = std.testing;
76
const assert = std.debug.assert;
87

@@ -11,8 +10,10 @@ pub const std_options: std.Options = .{
1110
};
1211

1312
var log_err_count: usize = 0;
14-
var fba_buffer: [8192]u8 = undefined;
1513
var fba = std.heap.FixedBufferAllocator.init(&fba_buffer);
14+
var fba_buffer: [8192]u8 = undefined;
15+
var stdin_buffer: [4096]u8 = undefined;
16+
var stdout_buffer: [4096]u8 = undefined;
1617

1718
const crippled = switch (builtin.zig_backend) {
1819
.stage2_powerpc,
@@ -67,13 +68,13 @@ pub fn main() void {
6768

6869
fn mainServer() !void {
6970
@disableInstrumentation();
71+
var stdin_reader = std.fs.File.stdin().readerStreaming(&stdin_buffer);
72+
var stdout_writer = std.fs.File.stdout().writerStreaming(&stdout_buffer);
7073
var server = try std.zig.Server.init(.{
71-
.gpa = fba.allocator(),
72-
.in = .stdin(),
73-
.out = .stdout(),
74+
.in = &stdin_reader.interface,
75+
.out = &stdout_writer.interface,
7476
.zig_version = builtin.zig_version_string,
7577
});
76-
defer server.deinit();
7778

7879
if (builtin.fuzz) {
7980
const coverage_id = fuzzer_coverage_id();
@@ -103,7 +104,7 @@ fn mainServer() !void {
103104
defer testing.allocator.free(expected_panic_msgs);
104105

105106
for (test_fns, names, expected_panic_msgs) |test_fn, *name, *expected_panic_msg| {
106-
name.* = @as(u32, @intCast(string_bytes.items.len));
107+
name.* = @intCast(string_bytes.items.len);
107108
try string_bytes.ensureUnusedCapacity(testing.allocator, test_fn.name.len + 1);
108109
string_bytes.appendSliceAssumeCapacity(test_fn.name);
109110
string_bytes.appendAssumeCapacity(0);

lib/std/Build/Step/Run.zig

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

17501750
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: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -860,7 +860,15 @@ pub inline fn writeSliceEndian(
860860
if (native_endian == endian) {
861861
return writeAll(w, @ptrCast(slice));
862862
} else {
863-
return w.writeArraySwap(w, Elem, slice);
863+
return writeSliceSwap(w, Elem, slice);
864+
}
865+
}
866+
867+
pub fn writeSliceSwap(w: *Writer, Elem: type, slice: []const Elem) Error!void {
868+
for (slice) |elem| {
869+
var tmp = elem;
870+
std.mem.byteSwapAllFields(Elem, &tmp);
871+
try w.writeAll(@ptrCast(&tmp));
864872
}
865873
}
866874

@@ -2638,3 +2646,12 @@ test writeStruct {
26382646
}, &buffer);
26392647
}
26402648
}
2649+
2650+
test writeSliceEndian {
2651+
var buffer: [5]u8 align(2) = undefined;
2652+
var w: Writer = .fixed(&buffer);
2653+
try w.writeByte('x');
2654+
const array: [2]u16 = .{ 0x1234, 0x5678 };
2655+
try writeSliceEndian(&w, u16, &array, .big);
2656+
try testing.expectEqualSlices(u8, &.{ 'x', 0x12, 0x34, 0x56, 0x78 }, &buffer);
2657+
}

lib/std/debug.zig

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -566,6 +566,13 @@ pub fn assertReadable(slice: []const volatile u8) void {
566566
for (slice) |*byte| _ = byte.*;
567567
}
568568

569+
/// Invokes detectable illegal behavior when the provided array is not aligned
570+
/// to the provided amount.
571+
pub fn assertAligned(ptr: anytype, comptime alignment: std.mem.Alignment) void {
572+
const aligned_ptr: *align(alignment.toByteUnits()) anyopaque = @alignCast(@ptrCast(ptr));
573+
_ = aligned_ptr;
574+
}
575+
569576
/// Equivalent to `@panic` but with a formatted message.
570577
pub fn panic(comptime format: []const u8, args: anytype) noreturn {
571578
@branchHint(.cold);

lib/std/mem.zig

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2179,22 +2179,8 @@ pub fn byteSwapAllFields(comptime S: type, ptr: *S) void {
21792179
const BackingInt = std.meta.Int(.unsigned, @bitSizeOf(S));
21802180
ptr.* = @bitCast(@byteSwap(@as(BackingInt, @bitCast(ptr.*))));
21812181
},
2182-
.array => {
2183-
for (ptr) |*item| {
2184-
switch (@typeInfo(@TypeOf(item.*))) {
2185-
.@"struct", .@"union", .array => byteSwapAllFields(@TypeOf(item.*), item),
2186-
.@"enum" => {
2187-
item.* = @enumFromInt(@byteSwap(@intFromEnum(item.*)));
2188-
},
2189-
.bool => {},
2190-
.float => |float_info| {
2191-
item.* = @bitCast(@byteSwap(@as(std.meta.Int(.unsigned, float_info.bits), @bitCast(item.*))));
2192-
},
2193-
else => {
2194-
item.* = @byteSwap(item.*);
2195-
},
2196-
}
2197-
}
2182+
.array => |info| {
2183+
byteSwapAllElements(info.child, ptr);
21982184
},
21992185
else => {
22002186
ptr.* = @byteSwap(ptr.*);
@@ -2258,6 +2244,24 @@ test byteSwapAllFields {
22582244
}, k);
22592245
}
22602246

2247+
pub fn byteSwapAllElements(comptime Elem: type, slice: []Elem) void {
2248+
for (slice) |*elem| {
2249+
switch (@typeInfo(@TypeOf(elem.*))) {
2250+
.@"struct", .@"union", .array => byteSwapAllFields(@TypeOf(elem.*), elem),
2251+
.@"enum" => {
2252+
elem.* = @enumFromInt(@byteSwap(@intFromEnum(elem.*)));
2253+
},
2254+
.bool => {},
2255+
.float => |float_info| {
2256+
elem.* = @bitCast(@byteSwap(@as(std.meta.Int(.unsigned, float_info.bits), @bitCast(elem.*))));
2257+
},
2258+
else => {
2259+
elem.* = @byteSwap(elem.*);
2260+
},
2261+
}
2262+
}
2263+
}
2264+
22612265
/// Returns an iterator that iterates over the slices of `buffer` that are not
22622266
/// any of the items in `delimiters`.
22632267
///

lib/std/zig.zig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -908,4 +908,5 @@ test {
908908
_ = system;
909909
_ = target;
910910
_ = c_translation;
911+
_ = llvm;
911912
}

lib/std/zig/LibCInstallation.zig

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,7 @@ fn findNativeIncludeDirWindows(
370370

371371
for (installs) |install| {
372372
result_buf.shrinkAndFree(0);
373-
try result_buf.writer().print("{s}\\Include\\{s}\\ucrt", .{ install.path, install.version });
373+
try result_buf.print("{s}\\Include\\{s}\\ucrt", .{ install.path, install.version });
374374

375375
var dir = fs.cwd().openDir(result_buf.items, .{}) catch |err| switch (err) {
376376
error.FileNotFound,
@@ -417,7 +417,7 @@ fn findNativeCrtDirWindows(
417417

418418
for (installs) |install| {
419419
result_buf.shrinkAndFree(0);
420-
try result_buf.writer().print("{s}\\Lib\\{s}\\ucrt\\{s}", .{ install.path, install.version, arch_sub_dir });
420+
try result_buf.print("{s}\\Lib\\{s}\\ucrt\\{s}", .{ install.path, install.version, arch_sub_dir });
421421

422422
var dir = fs.cwd().openDir(result_buf.items, .{}) catch |err| switch (err) {
423423
error.FileNotFound,
@@ -484,8 +484,7 @@ fn findNativeKernel32LibDir(
484484

485485
for (installs) |install| {
486486
result_buf.shrinkAndFree(0);
487-
const stream = result_buf.writer();
488-
try stream.print("{s}\\Lib\\{s}\\um\\{s}", .{ install.path, install.version, arch_sub_dir });
487+
try result_buf.print("{s}\\Lib\\{s}\\um\\{s}", .{ install.path, install.version, arch_sub_dir });
489488

490489
var dir = fs.cwd().openDir(result_buf.items, .{}) catch |err| switch (err) {
491490
error.FileNotFound,

0 commit comments

Comments
 (0)