zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit aacf8ce03d2b52e52830873c40eabb1cb1eb8272 (tree)
parent 37d14a4f3ba8993533cc0cf76cf295ba50ea8fed
Author: Jake Greenfield <jake@greenfield.sh>
Date:   Sun,  1 Feb 2026 22:04:20 -0500

Use MultiReader in `zig std`

Diffstat:
Mlib/compiler/std-docs.zig | 42+++++++++++++++++++++++++++---------------
1 file changed, 27 insertions(+), 15 deletions(-)

diff --git a/lib/compiler/std-docs.zig b/lib/compiler/std-docs.zig @@ -324,11 +324,10 @@ fn buildWasmBinary( .stderr = .pipe, }); - var poller = Io.poll(gpa, enum { stdout, stderr }, .{ - .stdout = child.stdout.?, - .stderr = child.stderr.?, - }); - defer poller.deinit(); + var multi_reader_buffer: Io.File.MultiReader.Buffer(2) = undefined; + var multi_reader: Io.File.MultiReader = undefined; + multi_reader.init(gpa, io, multi_reader_buffer.toStreams(), &.{ child.stdout.?, child.stderr.? }); + defer multi_reader.deinit(); try sendMessage(io, child.stdin.?, .update); try sendMessage(io, child.stdin.?, .exit); @@ -336,14 +335,23 @@ fn buildWasmBinary( var result: ?Cache.Path = null; var result_error_bundle = std.zig.ErrorBundle.empty; - const stdout = poller.reader(.stdout); + const stdout = multi_reader.fileReader(0); + const MessageHeader = std.zig.Server.Message.Header; + + var eos_err: error{EndOfStream}!void = {}; - poll: while (true) { - const Header = std.zig.Server.Message.Header; - while (stdout.buffered().len < @sizeOf(Header)) if (!try poller.poll()) break :poll; - const header = stdout.takeStruct(Header, .little) catch unreachable; - while (stdout.buffered().len < header.bytes_len) if (!try poller.poll()) break :poll; - const body = stdout.take(header.bytes_len) catch unreachable; + while (true) { + const header = stdout.interface.takeStruct(MessageHeader, .little) catch |err| switch (err) { + error.EndOfStream => break, + error.ReadFailed => return stdout.err.?, + }; + const body = stdout.interface.take(header.bytes_len) catch |err| switch (err) { + error.EndOfStream => |e| { + eos_err = e; + break; + }, + error.ReadFailed => return stdout.err.?, + }; switch (header.tag) { .zig_version => { @@ -372,11 +380,15 @@ fn buildWasmBinary( } } - const stderr = poller.reader(.stderr); - if (stderr.bufferedLen() > 0) { - std.debug.print("{s}", .{stderr.buffered()}); + try multi_reader.fillRemaining(.none); + const stderr = multi_reader.reader(1).buffered(); + + if (stderr.len > 0) { + std.debug.print("{s}", .{stderr}); } + try eos_err; + // Send EOF to stdin. child.stdin.?.close(io); child.stdin = null;