| ... | @@ -1,6 +1,7 @@ | ... | @@ -1,6 +1,7 @@ |
| 1 | const assert = std.debug.assert; | 1 | const assert = std.debug.assert; |
| 2 | const std = @import("std"); | 2 | const std = @import("std"); |
| 3 | const Runner = @This(); | 3 | const Runner = @This(); |
| | 4 | const zig_version_string = @import("builtin").zig_version_string; |
| 4 | | 5 | |
| 5 | gpa: std.mem.Allocator, | 6 | gpa: std.mem.Allocator, |
| 6 | arena: *std.heap.ArenaAllocator, | 7 | arena: *std.heap.ArenaAllocator, |
| ... | @@ -51,24 +52,33 @@ fn deinit(runner: *Runner) void { | ... | @@ -51,24 +52,33 @@ fn deinit(runner: *Runner) void { |
| 51 | runner.* = undefined; | 52 | runner.* = undefined; |
| 52 | } | 53 | } |
| 53 | | 54 | |
| 54 | const Fallible = error{AlreadyReported} || std.mem.Allocator.Error || std.Io.Cancelable; | 55 | const FailError = error{AlreadyReported} || std.mem.Allocator.Error || std.Io.Cancelable; |
| 55 | fn fail(runner: *Runner, comptime fmt: []const u8, args: anytype) Fallible { | 56 | fn fail(runner: *Runner, comptime fmt: []const u8, args: anytype) FailError { |
| 56 | return runner.failString(try runner.eb_wip.printString(fmt, args)); | 57 | return runner.failString(try runner.eb_wip.printString(fmt, args)); |
| 57 | } | 58 | } |
| 58 | fn failString(runner: *Runner, msg: std.zig.ErrorBundle.String) Fallible { | 59 | fn failString(runner: *Runner, msg: std.zig.ErrorBundle.String) FailError { |
| 59 | try runner.eb_wip.addRootErrorMessage(.{ | 60 | try runner.eb_wip.addRootErrorMessage(.{ |
| 60 | .msg = msg, | 61 | .msg = msg, |
| 61 | }); | 62 | }); |
| 62 | return error.AlreadyReported; | 63 | return error.AlreadyReported; |
| 63 | } | 64 | } |
| 64 | | 65 | |
| 65 | pub const ProtocolError = Fallible || std.Io.Reader.Error || std.Io.Writer.Error; | 66 | pub const ProtocolError = error{ |
| | 67 | ServerReadFailed, |
| | 68 | ServerWriteFailed, |
| | 69 | ServerEndOfStream, |
| | 70 | } || FailError; |
| 66 | pub fn runServer(runner: *Runner) ProtocolError { | 71 | pub fn runServer(runner: *Runner) ProtocolError { |
| 67 | try runner.server.serveStringMessage(.zig_version, @import("builtin").zig_version_string); | 72 | runner.server.serveStringMessage(.zig_version, zig_version_string) catch |err| switch (err) { |
| | 73 | error.WriteFailed => return error.ServerWriteFailed, |
| | 74 | }; |
| 68 | while (true) { | 75 | while (true) { |
| 69 | _ = runner.arena.reset(.retain_capacity); | 76 | _ = runner.arena.reset(.retain_capacity); |
| 70 | const arena = runner.arena.allocator(); | 77 | const arena = runner.arena.allocator(); |
| 71 | const hdr = try runner.server.receiveMessage(); | 78 | const hdr = runner.server.receiveMessage() catch |err| switch (err) { |
| | 79 | error.ReadFailed => return error.ServerReadFailed, |
| | 80 | error.EndOfStream => return error.ServerEndOfStream, |
| | 81 | }; |
| 72 | switch (hdr.tag) { | 82 | switch (hdr.tag) { |
| 73 | else => |tag| return runner.fail("unsupported message: {t}", .{tag}), | 83 | else => |tag| return runner.fail("unsupported message: {t}", .{tag}), |
| 74 | .exit => std.process.exit(0), | 84 | .exit => std.process.exit(0), |
| ... | @@ -273,16 +283,20 @@ pub fn runServer(runner: *Runner) ProtocolError { | ... | @@ -273,16 +283,20 @@ pub fn runServer(runner: *Runner) ProtocolError { |
| 273 | .query_test_metadata => { | 283 | .query_test_metadata => { |
| 274 | const expected_panic_msgs = try arena.alloc(u32, runner.args.targets.items.len); | 284 | const expected_panic_msgs = try arena.alloc(u32, runner.args.targets.items.len); |
| 275 | @memset(expected_panic_msgs, 0); | 285 | @memset(expected_panic_msgs, 0); |
| 276 | try runner.server.serveTestMetadata(.{ | 286 | runner.server.serveTestMetadata(.{ |
| 277 | .names = runner.args.targets.items, | 287 | .names = runner.args.targets.items, |
| 278 | .expected_panic_msgs = expected_panic_msgs, | 288 | .expected_panic_msgs = expected_panic_msgs, |
| 279 | .string_bytes = runner.args.target_bytes.items, | 289 | .string_bytes = runner.args.target_bytes.items, |
| 280 | }); | 290 | }) catch |err| switch (err) { |
| | 291 | error.WriteFailed => return error.ServerWriteFailed, |
| | 292 | }; |
| 281 | }, | 293 | }, |
| 282 | .run_test => { | 294 | .run_test => { |
| 283 | const test_index = runner.server.receiveBody_u32() catch unreachable; | 295 | const test_index = runner.server.receiveBody_u32() catch unreachable; |
| 284 | try runner.server.serveBodylessMessage(.test_started); | 296 | runner.server.serveBodylessMessage(.test_started) catch |err| switch (err) { |
| 285 | try runner.server.serveTestResults(.{ | 297 | error.WriteFailed => return error.ServerWriteFailed, |
| | 298 | }; |
| | 299 | runner.server.serveTestResults(.{ |
| 286 | .index = test_index, | 300 | .index = test_index, |
| 287 | .flags = .{ | 301 | .flags = .{ |
| 288 | .status = if (runner.testOne(test_index)) | 302 | .status = if (runner.testOne(test_index)) |
| ... | @@ -290,14 +304,18 @@ pub fn runServer(runner: *Runner) ProtocolError { | ... | @@ -290,14 +304,18 @@ pub fn runServer(runner: *Runner) ProtocolError { |
| 290 | else |err| status: switch (err) { | 304 | else |err| status: switch (err) { |
| 291 | error.Canceled, | 305 | error.Canceled, |
| 292 | error.OutOfMemory, | 306 | error.OutOfMemory, |
| 293 | error.ReadFailed, | 307 | error.ServerWriteFailed, |
| 294 | error.WriteFailed, | | |
| 295 | => |e| return e, | 308 | => |e| return e, |
| 296 | error.AlreadyReported => { | 309 | error.AlreadyReported => { |
| 297 | var eb = try runner.eb_wip.toOwnedBundle(""); | 310 | var eb = try runner.eb_wip.toOwnedBundle(""); |
| 298 | defer eb.deinit(runner.gpa); | 311 | defer eb.deinit(runner.gpa); |
| 299 | assert(eb.errorMessageCount() > 0); // already reported what? | 312 | assert(eb.errorMessageCount() > 0); // already reported what? |
| 300 | try runner.server.serveErrorBundle(.error_bundle, eb); | 313 | runner.server.serveErrorBundle( |
| | 314 | .error_bundle, |
| | 315 | eb, |
| | 316 | ) catch |server_err| switch (server_err) { |
| | 317 | error.WriteFailed => return error.ServerWriteFailed, |
| | 318 | }; |
| 301 | const eb_wip: std.zig.ErrorBundle.Wip = try .init(runner.gpa); | 319 | const eb_wip: std.zig.ErrorBundle.Wip = try .init(runner.gpa); |
| 302 | runner.eb_wip.deinit(); | 320 | runner.eb_wip.deinit(); |
| 303 | runner.eb_wip = eb_wip; | 321 | runner.eb_wip = eb_wip; |
| ... | @@ -309,7 +327,9 @@ pub fn runServer(runner: *Runner) ProtocolError { | ... | @@ -309,7 +327,9 @@ pub fn runServer(runner: *Runner) ProtocolError { |
| 309 | .log_err_count = 0, | 327 | .log_err_count = 0, |
| 310 | .leak_count = 0, | 328 | .leak_count = 0, |
| 311 | }, | 329 | }, |
| 312 | }); | 330 | }) catch |err| switch (err) { |
| | 331 | error.WriteFailed => return error.ServerWriteFailed, |
| | 332 | }; |
| 313 | assert(runner.eb_wip.root_list.items.len == 0); // failed to report | 333 | assert(runner.eb_wip.root_list.items.len == 0); // failed to report |
| 314 | }, | 334 | }, |
| 315 | } | 335 | } |
| ... | @@ -320,6 +340,15 @@ fn discoverInput( | ... | @@ -320,6 +340,15 @@ fn discoverInput( |
| 320 | runner: *Runner, | 340 | runner: *Runner, |
| 321 | dir: std.zig.Server.Message.InputDir, | 341 | dir: std.zig.Server.Message.InputDir, |
| 322 | sub_path: []const u8, | 342 | sub_path: []const u8, |
| | 343 | ) error{ServerWriteFailed}!void { |
| | 344 | return runner.discoverInputInner(dir, sub_path) catch |err| switch (err) { |
| | 345 | error.WriteFailed => return error.ServerWriteFailed, |
| | 346 | }; |
| | 347 | } |
| | 348 | fn discoverInputInner( |
| | 349 | runner: *Runner, |
| | 350 | dir: std.zig.Server.Message.InputDir, |
| | 351 | sub_path: []const u8, |
| 323 | ) std.Io.Writer.Error!void { | 352 | ) std.Io.Writer.Error!void { |
| 324 | try runner.server.serveMessageHeader(.{ | 353 | try runner.server.serveMessageHeader(.{ |
| 325 | .tag = .discovered_inputs, | 354 | .tag = .discovered_inputs, |
| ... | @@ -435,14 +464,14 @@ pub const SourceReader = struct { | ... | @@ -435,14 +464,14 @@ pub const SourceReader = struct { |
| 435 | src_loc: []const u8, | 464 | src_loc: []const u8, |
| 436 | comptime fmt: []const u8, | 465 | comptime fmt: []const u8, |
| 437 | args: anytype, | 466 | args: anytype, |
| 438 | ) Fallible { | 467 | ) FailError { |
| 439 | return s.failString(src_loc, try s.eb_wip.printString(fmt, args)); | 468 | return s.failString(src_loc, try s.eb_wip.printString(fmt, args)); |
| 440 | } | 469 | } |
| 441 | fn failString( | 470 | fn failString( |
| 442 | s: *SourceReader, | 471 | s: *SourceReader, |
| 443 | src_loc: []const u8, | 472 | src_loc: []const u8, |
| 444 | msg: std.zig.ErrorBundle.String, | 473 | msg: std.zig.ErrorBundle.String, |
| 445 | ) Fallible { | 474 | ) FailError { |
| 446 | const line: u32, const column: u32, const source_line = src_loc: { | 475 | const line: u32, const column: u32, const source_line = src_loc: { |
| 447 | const pos = src_loc.ptr - s.interface.buffer.ptr; | 476 | const pos = src_loc.ptr - s.interface.buffer.ptr; |
| 448 | const end = std.mem.findScalarPos(u8, s.interface.buffer, pos, '\n') orelse | 477 | const end = std.mem.findScalarPos(u8, s.interface.buffer, pos, '\n') orelse |
| ... | @@ -531,8 +560,8 @@ const Update = struct { | ... | @@ -531,8 +560,8 @@ const Update = struct { |
| 531 | | 560 | |
| 532 | const TestError = error{ | 561 | const TestError = error{ |
| 533 | SkipTest, | 562 | SkipTest, |
| 534 | } || Fallible || std.Io.Reader.ShortError || std.Io.Writer.Error; | 563 | } || FailError; |
| 535 | fn testOne(runner: *Runner, test_index: u32) TestError!void { | 564 | fn testOne(runner: *Runner, test_index: u32) (error{ServerWriteFailed} || TestError)!void { |
| 536 | const target_query = | 565 | const target_query = |
| 537 | std.mem.sliceTo(runner.args.target_bytes.items[runner.args.targets.items[test_index]..], 0); | 566 | std.mem.sliceTo(runner.args.target_bytes.items[runner.args.targets.items[test_index]..], 0); |
| 538 | const manifest_file = runner.args.manifest_file orelse | 567 | const manifest_file = runner.args.manifest_file orelse |
| ... | @@ -660,16 +689,24 @@ fn testOne(runner: *Runner, test_index: u32) TestError!void { | ... | @@ -660,16 +689,24 @@ fn testOne(runner: *Runner, test_index: u32) TestError!void { |
| 660 | error.OutOfMemory, | 689 | error.OutOfMemory, |
| 661 | error.AlreadyReported, | 690 | error.AlreadyReported, |
| 662 | error.SkipTest, | 691 | error.SkipTest, |
| 663 | error.WriteFailed, | | |
| 664 | => |e| return e, | 692 | => |e| return e, |
| 665 | error.ReadFailed => switch (contents_impl) { | 693 | error.ContentsReadFailed => switch (contents_impl) { |
| 666 | .ending => unreachable, | 694 | .ending => unreachable, |
| 667 | .dr => return runner.fail("unable to read manifest: {t}", .{manifest_fr.err.?}), | 695 | .dr => switch (manifest_fr.err orelse return error.OutOfMemory) { |
| 668 | .fr => |fr| return runner.fail("unable to read contents file: {t}", .{fr.err.?}), | 696 | error.Canceled => |e| return e, |
| | 697 | else => |e| return runner.fail("unable to read manifest: {t}", .{e}), |
| | 698 | }, |
| | 699 | .fr => |fr| switch (fr.err.?) { |
| | 700 | error.Canceled => |e| return e, |
| | 701 | else => |e| return runner.fail("unable to read contents file: {t}", .{e}), |
| | 702 | }, |
| 669 | }, | 703 | }, |
| 670 | }; | 704 | }; |
| 671 | } else |err| switch (err) { | 705 | } else |err| switch (err) { |
| 672 | error.ReadFailed => |e| return e, | 706 | error.ReadFailed => switch (manifest_fr.err orelse return error.OutOfMemory) { |
| | 707 | error.Canceled => |e| return e, |
| | 708 | else => |e| return runner.fail("unable to read manifest: {t}", .{e}), |
| | 709 | }, |
| 673 | error.StreamTooLong => unreachable, | 710 | error.StreamTooLong => unreachable, |
| 674 | error.EndOfStream => if (skip_delimiter) | 711 | error.EndOfStream => if (skip_delimiter) |
| 675 | return runner.fail("manifest missing \"#}}\" delimiter", .{}), | 712 | return runner.fail("manifest missing \"#}}\" delimiter", .{}), |
| ... | @@ -687,7 +724,7 @@ fn handleCommand( | ... | @@ -687,7 +724,7 @@ fn handleCommand( |
| 687 | cmd: Command, | 724 | cmd: Command, |
| 688 | arg: ?[]const u8, | 725 | arg: ?[]const u8, |
| 689 | contents_r: *std.Io.Reader, | 726 | contents_r: *std.Io.Reader, |
| 690 | ) TestError!void { | 727 | ) (error{ContentsReadFailed} || TestError)!void { |
| 691 | var name_buffer: [std.Progress.Node.max_name_len]u8 = undefined; | 728 | var name_buffer: [std.Progress.Node.max_name_len]u8 = undefined; |
| 692 | const cmd_prog_node = runner.prog_node.start(std.mem.print(&name_buffer, "#{t}{s}{s}", .{ | 729 | const cmd_prog_node = runner.prog_node.start(std.mem.print(&name_buffer, "#{t}{s}{s}", .{ |
| 693 | cmd, if (arg) |_| " " else "", arg orelse "", | 730 | cmd, if (arg) |_| " " else "", arg orelse "", |
| ... | @@ -702,9 +739,8 @@ fn handleCommand( | ... | @@ -702,9 +739,8 @@ fn handleCommand( |
| 702 | cmd_src_loc, | 739 | cmd_src_loc, |
| 703 | "\"#skip\" must appear before other commands", | 740 | "\"#skip\" must appear before other commands", |
| 704 | .{}, | 741 | .{}, |
| 705 | ) else if (std.mem.eql(u8, update.target_query, arg.?)) | 742 | ) else if (std.mem.eql(u8, update.target_query, arg.?)) return error.SkipTest, |
| 706 | return error.SkipTest, | 743 | .exe, .lib, .obj => runner.spawnCompiler(&update.compiler, update.src_dir, switch (cmd) { |
| 707 | .exe, .lib, .obj => try runner.spawnCompiler(&update.compiler, update.src_dir, switch (cmd) { | | |
| 708 | else => unreachable, | 744 | else => unreachable, |
| 709 | .exe => .Exe, | 745 | .exe => .Exe, |
| 710 | .lib => .Lib, | 746 | .lib => .Lib, |
| ... | @@ -746,7 +782,10 @@ fn handleCommand( | ... | @@ -746,7 +782,10 @@ fn handleCommand( |
| 746 | .mode = mode, | 782 | .mode = mode, |
| 747 | .backend = backend, | 783 | .backend = backend, |
| 748 | }; | 784 | }; |
| 749 | }), | 785 | }) catch |err| switch (err) { |
| | 786 | error.Canceled, error.OutOfMemory, error.AlreadyReported => |e| return e, |
| | 787 | error.ReadFailed => return error.ContentsReadFailed, |
| | 788 | }, |
| 750 | .write => { | 789 | .write => { |
| 751 | const file = update.src_dir.createFile(runner.io, arg.?, .{}) catch |err| switch (err) { | 790 | const file = update.src_dir.createFile(runner.io, arg.?, .{}) catch |err| switch (err) { |
| 752 | error.Canceled => |e| return e, | 791 | error.Canceled => |e| return e, |
| ... | @@ -756,7 +795,7 @@ fn handleCommand( | ... | @@ -756,7 +795,7 @@ fn handleCommand( |
| 756 | var fw_buffer: [512]u8 = undefined; | 795 | var fw_buffer: [512]u8 = undefined; |
| 757 | var fw = file.writer(runner.io, &fw_buffer); | 796 | var fw = file.writer(runner.io, &fw_buffer); |
| 758 | _ = contents_r.streamRemaining(&fw.interface) catch |err| switch (err) { | 797 | _ = contents_r.streamRemaining(&fw.interface) catch |err| switch (err) { |
| 759 | error.ReadFailed => |e| return e, | 798 | error.ReadFailed => return error.ContentsReadFailed, |
| 760 | error.WriteFailed => switch (fw.err.?) { | 799 | error.WriteFailed => switch (fw.err.?) { |
| 761 | error.Canceled => |e| return e, | 800 | error.Canceled => |e| return e, |
| 762 | else => |e| return update.manifest_sr.fail( | 801 | else => |e| return update.manifest_sr.fail( |
| ... | @@ -797,7 +836,9 @@ fn handleCommand( | ... | @@ -797,7 +836,9 @@ fn handleCommand( |
| 797 | )); | 836 | )); |
| 798 | update.prog_node.end(); | 837 | update.prog_node.end(); |
| 799 | update.prog_node = runner.prog_node.start( | 838 | update.prog_node = runner.prog_node.start( |
| 800 | switch (try contents_r.readSliceShort(&name_buffer)) { | 839 | switch (contents_r.readSliceShort(&name_buffer) catch |err| switch (err) { |
| | 840 | error.ReadFailed => return error.ContentsReadFailed, |
| | 841 | }) { |
| 801 | 0 => switch (update.num) { | 842 | 0 => switch (update.num) { |
| 802 | 0 => "initial update", | 843 | 0 => "initial update", |
| 803 | else => |num| std.mem.print(&name_buffer, "update {d}", .{num}) catch | 844 | else => |num| std.mem.print(&name_buffer, "update {d}", .{num}) catch |
| ... | @@ -807,10 +848,17 @@ fn handleCommand( | ... | @@ -807,10 +848,17 @@ fn handleCommand( |
| 807 | }, | 848 | }, |
| 808 | 0, | 849 | 0, |
| 809 | ); | 850 | ); |
| 810 | _ = try contents_r.discardRemaining(); | 851 | _ = contents_r.discardRemaining() catch |err| switch (err) { |
| | 852 | error.ReadFailed => return error.ContentsReadFailed, |
| | 853 | }; |
| 811 | if (comp.state != .idle) | 854 | if (comp.state != .idle) |
| 812 | return update.manifest_sr.fail(cmd_src_loc, "missing \"#check\"", .{}); | 855 | return update.manifest_sr.fail(cmd_src_loc, "missing \"#check\"", .{}); |
| 813 | try comp.client.serveBodylessMessage(.update); | 856 | comp.client.serveBodylessMessage(.update) catch |err| switch (err) { |
| | 857 | error.WriteFailed => switch (comp.fw.err.?) { |
| | 858 | error.Canceled => |e| return e, |
| | 859 | else => |e| return runner.fail("unable to send message to compiler: {t}", .{e}), |
| | 860 | }, |
| | 861 | }; |
| 814 | comp.state = .update; | 862 | comp.state = .update; |
| 815 | update.mtime = update.mtime.addDuration(.fromSeconds(2)); | 863 | update.mtime = update.mtime.addDuration(.fromSeconds(2)); |
| 816 | update.num += 1; | 864 | update.num += 1; |
| ... | @@ -820,7 +868,8 @@ fn handleCommand( | ... | @@ -820,7 +868,8 @@ fn handleCommand( |
| 820 | return update.manifest_sr.fail(arg.?, "unknown check", .{}); | 868 | return update.manifest_sr.fail(arg.?, "unknown check", .{}); |
| 821 | const expected = | 869 | const expected = |
| 822 | contents_r.allocRemaining(runner.gpa, .unlimited) catch |err| switch (err) { | 870 | contents_r.allocRemaining(runner.gpa, .unlimited) catch |err| switch (err) { |
| 823 | error.OutOfMemory, error.ReadFailed => |e| return e, | 871 | error.OutOfMemory => |e| return e, |
| | 872 | error.ReadFailed => return error.ContentsReadFailed, |
| 824 | error.StreamTooLong => unreachable, // .unlimited | 873 | error.StreamTooLong => unreachable, // .unlimited |
| 825 | }; | 874 | }; |
| 826 | defer runner.gpa.free(expected); | 875 | defer runner.gpa.free(expected); |
| ... | @@ -860,11 +909,13 @@ fn handleCommand( | ... | @@ -860,11 +909,13 @@ fn handleCommand( |
| 860 | .errors => { | 909 | .errors => { |
| 861 | var error_aw: std.Io.Writer.Allocating = .init(runner.gpa); | 910 | var error_aw: std.Io.Writer.Allocating = .init(runner.gpa); |
| 862 | defer error_aw.deinit(); | 911 | defer error_aw.deinit(); |
| 863 | try eb.renderToWriter(.{ | 912 | eb.renderToWriter(.{ |
| 864 | .include_reference_trace = false, | 913 | .include_reference_trace = false, |
| 865 | .include_source_line = false, | 914 | .include_source_line = false, |
| 866 | .include_log_text = true, | 915 | .include_log_text = true, |
| 867 | }, &error_aw.writer); | 916 | }, &error_aw.writer) catch |err| switch (err) { |
| | 917 | error.WriteFailed => return error.OutOfMemory, |
| | 918 | }; |
| 868 | const actual = error_aw.written(); | 919 | const actual = error_aw.written(); |
| 869 | std.mem.replaceScalar(u8, actual, '\\', '/'); | 920 | std.mem.replaceScalar(u8, actual, '\\', '/'); |
| 870 | std.testing.expectEqualStrings(expected, actual) catch |err| switch (err) { | 921 | std.testing.expectEqualStrings(expected, actual) catch |err| switch (err) { |
| ... | @@ -900,7 +951,9 @@ fn handleCommand( | ... | @@ -900,7 +951,9 @@ fn handleCommand( |
| 900 | return runner.fail("compiler failed to send terminating error_bundle", .{}); | 951 | return runner.fail("compiler failed to send terminating error_bundle", .{}); |
| 901 | }, | 952 | }, |
| 902 | } | 953 | } |
| 903 | assert(try contents_r.discardRemaining() == 0); | 954 | assert(contents_r.discardRemaining() catch |err| switch (err) { |
| | 955 | error.ReadFailed => return error.ContentsReadFailed, |
| | 956 | } == 0); |
| 904 | switch (cmd) { | 957 | switch (cmd) { |
| 905 | .todo, .skip => {}, | 958 | .todo, .skip => {}, |
| 906 | else => update.allow_skip = false, | 959 | else => update.allow_skip = false, |
| ... | @@ -914,7 +967,7 @@ fn spawnCompiler( | ... | @@ -914,7 +967,7 @@ fn spawnCompiler( |
| 914 | output_mode: std.lang.OutputMode, | 967 | output_mode: std.lang.OutputMode, |
| 915 | args_r: *std.Io.Reader, | 968 | args_r: *std.Io.Reader, |
| 916 | target: Compiler.Target, | 969 | target: Compiler.Target, |
| 917 | ) (Fallible || std.Io.Reader.ShortError)!void { | 970 | ) (std.Io.Reader.ShortError || FailError)!void { |
| 918 | const gpa = runner.gpa; | 971 | const gpa = runner.gpa; |
| 919 | const arena = runner.arena.allocator(); | 972 | const arena = runner.arena.allocator(); |
| 920 | if (compiler.*) |*comp| { | 973 | if (compiler.*) |*comp| { |
| ... | @@ -1072,7 +1125,7 @@ const Compiler = struct { | ... | @@ -1072,7 +1125,7 @@ const Compiler = struct { |
| 1072 | }; | 1125 | }; |
| 1073 | }; | 1126 | }; |
| 1074 | | 1127 | |
| 1075 | fn receiveMessage(comp: *Compiler) Fallible!?struct { | 1128 | fn receiveMessage(comp: *Compiler) FailError!?struct { |
| 1076 | tag: std.zig.Server.Message.Tag, | 1129 | tag: std.zig.Server.Message.Tag, |
| 1077 | body: []const u8, | 1130 | body: []const u8, |
| 1078 | } { | 1131 | } { |
| ... | @@ -1107,7 +1160,7 @@ const Compiler = struct { | ... | @@ -1107,7 +1160,7 @@ const Compiler = struct { |
| 1107 | expected: []const u8, | 1160 | expected: []const u8, |
| 1108 | src_dir: std.Io.Dir, | 1161 | src_dir: std.Io.Dir, |
| 1109 | digest: *const std.Build.Cache.BinDigest, | 1162 | digest: *const std.Build.Cache.BinDigest, |
| 1110 | ) Fallible!void { | 1163 | ) FailError!void { |
| 1111 | const runner = comp.runner; | 1164 | const runner = comp.runner; |
| 1112 | const gpa = runner.gpa; | 1165 | const gpa = runner.gpa; |
| 1113 | const arena = runner.arena.allocator(); | 1166 | const arena = runner.arena.allocator(); |
| ... | @@ -1288,7 +1341,7 @@ const Compiler = struct { | ... | @@ -1288,7 +1341,7 @@ const Compiler = struct { |
| 1288 | } | 1341 | } |
| 1289 | } | 1342 | } |
| 1290 | | 1343 | |
| 1291 | fn compileC(parent_comp: *Compiler, src_dir: std.Io.Dir, c_path: []const u8) Fallible![]const u8 { | 1344 | fn compileC(parent_comp: *Compiler, src_dir: std.Io.Dir, c_path: []const u8) FailError![]const u8 { |
| 1292 | const runner = parent_comp.runner; | 1345 | const runner = parent_comp.runner; |
| 1293 | const arena = runner.arena.allocator(); | 1346 | const arena = runner.arena.allocator(); |
| 1294 | var compiler: ?Compiler = null; | 1347 | var compiler: ?Compiler = null; |
| ... | @@ -1308,7 +1361,10 @@ const Compiler = struct { | ... | @@ -1308,7 +1361,10 @@ const Compiler = struct { |
| 1308 | }; | 1361 | }; |
| 1309 | const comp = &compiler.?; | 1362 | const comp = &compiler.?; |
| 1310 | comp.client.serveBodylessMessage(.update) catch |err| switch (err) { | 1363 | comp.client.serveBodylessMessage(.update) catch |err| switch (err) { |
| 1311 | error.WriteFailed => return runner.fail("unable to send message: {t}", .{comp.fw.err.?}), | 1364 | error.WriteFailed => switch (comp.fw.err.?) { |
| | 1365 | error.Canceled => |e| return e, |
| | 1366 | else => |e| return runner.fail("unable to send message: {t}", .{e}), |
| | 1367 | }, |
| 1312 | }; | 1368 | }; |
| 1313 | comp.state = .update; | 1369 | comp.state = .update; |
| 1314 | var out_path: ?[]const u8 = null; | 1370 | var out_path: ?[]const u8 = null; |
| ... | @@ -1348,7 +1404,7 @@ const Compiler = struct { | ... | @@ -1348,7 +1404,7 @@ const Compiler = struct { |
| 1348 | return out_path.?; | 1404 | return out_path.?; |
| 1349 | } | 1405 | } |
| 1350 | | 1406 | |
| 1351 | fn exit(comp: *Compiler) Fallible!void { | 1407 | fn exit(comp: *Compiler) FailError!void { |
| 1352 | const runner = comp.runner; | 1408 | const runner = comp.runner; |
| 1353 | comp.client.serveBodylessMessage(.exit) catch |err| switch (err) { | 1409 | comp.client.serveBodylessMessage(.exit) catch |err| switch (err) { |
| 1354 | error.WriteFailed => switch (comp.fw.err.?) { | 1410 | error.WriteFailed => switch (comp.fw.err.?) { |
| ... | @@ -1465,9 +1521,15 @@ pub fn main(init: std.process.Init) (std.mem.Allocator.Error || std.Io.Cancelabl | ... | @@ -1465,9 +1521,15 @@ pub fn main(init: std.process.Init) (std.mem.Allocator.Error || std.Io.Cancelabl |
| 1465 | defer runner.deinit(); | 1521 | defer runner.deinit(); |
| 1466 | switch (runner.runServer()) { | 1522 | switch (runner.runServer()) { |
| 1467 | error.Canceled, error.OutOfMemory => |e| return e, | 1523 | error.Canceled, error.OutOfMemory => |e| return e, |
| 1468 | error.ReadFailed => fatal("unable to receive message: {t}", .{stdin.err.?}), | 1524 | error.ServerReadFailed => switch (stdin.err.?) { |
| 1469 | error.EndOfStream => fatal("no more messages", .{}), | 1525 | error.Canceled => |e| return e, |
| 1470 | error.WriteFailed => fatal("unable to send message: {t}", .{stdout.err.?}), | 1526 | else => |e| fatal("unable to receive message: {t}", .{e}), |
| | 1527 | }, |
| | 1528 | error.ServerWriteFailed => switch (stdout.err.?) { |
| | 1529 | error.Canceled => |e| return e, |
| | 1530 | else => |e| fatal("unable to send message: {t}", .{e}), |
| | 1531 | }, |
| | 1532 | error.ServerEndOfStream => fatal("no more messages", .{}), |
| 1471 | error.AlreadyReported => { | 1533 | error.AlreadyReported => { |
| 1472 | var eb = try runner.eb_wip.toOwnedBundle(""); | 1534 | var eb = try runner.eb_wip.toOwnedBundle(""); |
| 1473 | defer eb.deinit(init.gpa); | 1535 | defer eb.deinit(init.gpa); |
| ... | @@ -1590,9 +1652,15 @@ pub fn main(init: std.process.Init) (std.mem.Allocator.Error || std.Io.Cancelabl | ... | @@ -1590,9 +1652,15 @@ pub fn main(init: std.process.Init) (std.mem.Allocator.Error || std.Io.Cancelabl |
| 1590 | }; | 1652 | }; |
| 1591 | const success = runClient(init.gpa, arena, init.io, &client, &args) catch |err| switch (err) { | 1653 | const success = runClient(init.gpa, arena, init.io, &client, &args) catch |err| switch (err) { |
| 1592 | error.OutOfMemory => |e| return e, | 1654 | error.OutOfMemory => |e| return e, |
| 1593 | error.ReadFailed => fatal("unable to receive message: {t}", .{child_reader.err.?}), | 1655 | error.ReadFailed => switch (child_reader.err.?) { |
| | 1656 | error.Canceled => |e| return e, |
| | 1657 | else => |e| fatal("unable to receive message: {t}", .{e}), |
| | 1658 | }, |
| | 1659 | error.WriteFailed => switch (child_writer.err.?) { |
| | 1660 | error.Canceled => |e| return e, |
| | 1661 | else => |e| fatal("unable to send message: {t}", .{e}), |
| | 1662 | }, |
| 1594 | error.EndOfStream => fatal("no more messages", .{}), | 1663 | error.EndOfStream => fatal("no more messages", .{}), |
| 1595 | error.WriteFailed => fatal("unable to send message: {t}", .{child_writer.err.?}), | | |
| 1596 | }; | 1664 | }; |
| 1597 | _ = child.wait(init.io) catch |err| switch (err) { | 1665 | _ = child.wait(init.io) catch |err| switch (err) { |
| 1598 | error.Canceled => |e| return e, | 1666 | error.Canceled => |e| return e, |
| ... | @@ -1734,12 +1802,11 @@ fn runClient( | ... | @@ -1734,12 +1802,11 @@ fn runClient( |
| 1734 | switch (hdr.tag) { | 1802 | switch (hdr.tag) { |
| 1735 | else => try client.in.discardAll(hdr.bytes_len), | 1803 | else => try client.in.discardAll(hdr.bytes_len), |
| 1736 | .zig_version => { | 1804 | .zig_version => { |
| 1737 | const expected = @import("builtin").zig_version_string; | 1805 | const actual_version = try client.in.take(hdr.bytes_len); |
| 1738 | const actual = try client.in.take(hdr.bytes_len); | 1806 | if (!std.mem.eql(u8, zig_version_string, actual_version)) { |
| 1739 | if (!std.mem.eql(u8, expected, actual)) { | | |
| 1740 | try stderr.print( | 1807 | try stderr.print( |
| 1741 | "error: zig version mismatch compiler test runner vs compiler: {q} vs {q}\n", | 1808 | "error: zig version mismatch compiler test runner vs compiler: {q} vs {q}\n", |
| 1742 | .{ expected, actual }, | 1809 | .{ zig_version_string, actual_version }, |
| 1743 | ); | 1810 | ); |
| 1744 | try stderr.flush(); | 1811 | try stderr.flush(); |
| 1745 | std.process.exit(1); | 1812 | std.process.exit(1); |