| ... | @@ -290,9 +290,8 @@ const Eval = struct { | ... | @@ -290,9 +290,8 @@ const Eval = struct { |
| 290 | return; | 290 | return; |
| 291 | }, | 291 | }, |
| 292 | .emit_digest => { | 292 | .emit_digest => { |
| 293 | const EbpHdr = std.zig.Server.Message.EmitDigest; | 293 | var r: std.Io.Reader = .fixed(body); |
| 294 | const ebp_hdr = @as(*align(1) const EbpHdr, @ptrCast(body)); | 294 | _ = r.takeStruct(std.zig.Server.Message.EmitDigest, .little) catch unreachable; |
| 295 | _ = ebp_hdr; | | |
| 296 | if (stderr.bufferedLen() > 0) { | 295 | if (stderr.bufferedLen() > 0) { |
| 297 | const stderr_data = try poller.toOwnedSlice(.stderr); | 296 | const stderr_data = try poller.toOwnedSlice(.stderr); |
| 298 | if (eval.allow_stderr) { | 297 | if (eval.allow_stderr) { |
| ... | @@ -307,7 +306,7 @@ const Eval = struct { | ... | @@ -307,7 +306,7 @@ const Eval = struct { |
| 307 | // This message indicates the end of the update. | 306 | // This message indicates the end of the update. |
| 308 | } | 307 | } |
| 309 | | 308 | |
| 310 | const digest = body[@sizeOf(EbpHdr)..][0..Cache.bin_digest_len]; | 309 | const digest = r.takeArray(Cache.bin_digest_len) catch unreachable; |
| 311 | const result_dir = ".local-cache" ++ std.fs.path.sep_str ++ "o" ++ std.fs.path.sep_str ++ Cache.binToHex(digest.*); | 310 | const result_dir = ".local-cache" ++ std.fs.path.sep_str ++ "o" ++ std.fs.path.sep_str ++ Cache.binToHex(digest.*); |
| 312 | | 311 | |
| 313 | const bin_name = try std.zig.EmitArtifact.bin.cacheName(arena, .{ | 312 | const bin_name = try std.zig.EmitArtifact.bin.cacheName(arena, .{ |
| ... | @@ -519,7 +518,10 @@ const Eval = struct { | ... | @@ -519,7 +518,10 @@ const Eval = struct { |
| 519 | .tag = .update, | 518 | .tag = .update, |
| 520 | .bytes_len = 0, | 519 | .bytes_len = 0, |
| 521 | }; | 520 | }; |
| 522 | try eval.child.stdin.?.writeAll(std.mem.asBytes(&header)); | 521 | var w = eval.child.stdin.?.writer(&.{}); |
| | 522 | w.interface.writeStruct(header, .little) catch |err| switch (err) { |
| | 523 | error.WriteFailed => return w.err.?, |
| | 524 | }; |
| 523 | } | 525 | } |
| 524 | | 526 | |
| 525 | fn end(eval: *Eval, poller: *Poller) !void { | 527 | fn end(eval: *Eval, poller: *Poller) !void { |
| ... | @@ -836,9 +838,12 @@ fn requestExit(child: *std.process.Child, eval: *Eval) void { | ... | @@ -836,9 +838,12 @@ fn requestExit(child: *std.process.Child, eval: *Eval) void { |
| 836 | .tag = .exit, | 838 | .tag = .exit, |
| 837 | .bytes_len = 0, | 839 | .bytes_len = 0, |
| 838 | }; | 840 | }; |
| 839 | child.stdin.?.writeAll(std.mem.asBytes(&header)) catch |err| switch (err) { | 841 | var w = eval.child.stdin.?.writer(&.{}); |
| 840 | error.BrokenPipe => {}, | 842 | w.interface.writeStruct(header, .little) catch |err| switch (err) { |
| 841 | else => eval.fatal("failed to send exit: {s}", .{@errorName(err)}), | 843 | error.WriteFailed => switch (w.err.?) { |
| | 844 | error.BrokenPipe => {}, |
| | 845 | else => |e| eval.fatal("failed to send exit: {s}", .{@errorName(e)}), |
| | 846 | }, |
| 842 | }; | 847 | }; |
| 843 | | 848 | |
| 844 | // Send EOF to stdin. | 849 | // Send EOF to stdin. |