authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-07-28 20:43:49-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-07-28 21:43:07-07:00
loge8e9a4ac664ca803514ca5f177f3384ce66e31fc
tree49a4f6ffbdaecc5786d5f656a2c55923aa854051
parent2826f78a61c014b7cfb9e7ce1a7efce31b24d0c9

Build: use optionals again

Closes #14952

1 files changed, 19 insertions(+), 44 deletions(-)

lib/std/Build/Step/Run.zig+19-44
......@@ -755,24 +755,19 @@ fn runCommand(
755755 // Capture stdout and stderr to GeneratedFile objects.
756756 const Stream = struct {
757757 captured: ?*Output,
758 is_null: bool,
759 bytes: []const u8,
758 bytes: ?[]const u8,
760759 };
761760 for ([_]Stream{
762761 .{
763762 .captured = self.captured_stdout,
764 .is_null = result.stdio.stdout_null,
765763 .bytes = result.stdio.stdout,
766764 },
767765 .{
768766 .captured = self.captured_stderr,
769 .is_null = result.stdio.stderr_null,
770767 .bytes = result.stdio.stderr,
771768 },
772769 }) |stream| {
773770 if (stream.captured) |output| {
774 assert(!stream.is_null);
775
776771 const output_components = .{ "o", digest.?, output.basename };
777772 const output_path = try b.cache_root.join(arena, &output_components);
778773 output.generated_file.path = output_path;
......@@ -784,7 +779,7 @@ fn runCommand(
784779 b.cache_root, sub_path_dirname, @errorName(err),
785780 });
786781 };
787 b.cache_root.handle.writeFile(sub_path, stream.bytes) catch |err| {
782 b.cache_root.handle.writeFile(sub_path, stream.bytes.?) catch |err| {
788783 return step.fail("unable to write file '{}{s}': {s}", .{
789784 b.cache_root, sub_path, @errorName(err),
790785 });
......@@ -797,8 +792,7 @@ fn runCommand(
797792 switch (self.stdio) {
798793 .check => |checks| for (checks.items) |check| switch (check) {
799794 .expect_stderr_exact => |expected_bytes| {
800 assert(!result.stdio.stderr_null);
801 if (!mem.eql(u8, expected_bytes, result.stdio.stderr)) {
795 if (!mem.eql(u8, expected_bytes, result.stdio.stderr.?)) {
802796 return step.fail(
803797 \\
804798 \\========= expected this stderr: =========
......@@ -809,14 +803,13 @@ fn runCommand(
809803 \\{s}
810804 , .{
811805 expected_bytes,
812 result.stdio.stderr,
806 result.stdio.stderr.?,
813807 try Step.allocPrintCmd(arena, self.cwd, final_argv),
814808 });
815809 }
816810 },
817811 .expect_stderr_match => |match| {
818 assert(!result.stdio.stderr_null);
819 if (mem.indexOf(u8, result.stdio.stderr, match) == null) {
812 if (mem.indexOf(u8, result.stdio.stderr.?, match) == null) {
820813 return step.fail(
821814 \\
822815 \\========= expected to find in stderr: =========
......@@ -827,14 +820,13 @@ fn runCommand(
827820 \\{s}
828821 , .{
829822 match,
830 result.stdio.stderr,
823 result.stdio.stderr.?,
831824 try Step.allocPrintCmd(arena, self.cwd, final_argv),
832825 });
833826 }
834827 },
835828 .expect_stdout_exact => |expected_bytes| {
836 assert(!result.stdio.stdout_null);
837 if (!mem.eql(u8, expected_bytes, result.stdio.stdout)) {
829 if (!mem.eql(u8, expected_bytes, result.stdio.stdout.?)) {
838830 return step.fail(
839831 \\
840832 \\========= expected this stdout: =========
......@@ -845,14 +837,13 @@ fn runCommand(
845837 \\{s}
846838 , .{
847839 expected_bytes,
848 result.stdio.stdout,
840 result.stdio.stdout.?,
849841 try Step.allocPrintCmd(arena, self.cwd, final_argv),
850842 });
851843 }
852844 },
853845 .expect_stdout_match => |match| {
854 assert(!result.stdio.stdout_null);
855 if (mem.indexOf(u8, result.stdio.stdout, match) == null) {
846 if (mem.indexOf(u8, result.stdio.stdout.?, match) == null) {
856847 return step.fail(
857848 \\
858849 \\========= expected to find in stdout: =========
......@@ -863,7 +854,7 @@ fn runCommand(
863854 \\{s}
864855 , .{
865856 match,
866 result.stdio.stdout,
857 result.stdio.stdout.?,
867858 try Step.allocPrintCmd(arena, self.cwd, final_argv),
868859 });
869860 }
......@@ -982,12 +973,8 @@ fn spawnChildAndCollect(
982973}
983974
984975const StdIoResult = struct {
985 // These use boolean flags instead of optionals as a workaround for
986 // https://github.com/ziglang/zig/issues/14783
987 stdout: []const u8,
988 stderr: []const u8,
989 stdout_null: bool,
990 stderr_null: bool,
976 stdout: ?[]const u8,
977 stderr: ?[]const u8,
991978 test_results: Step.TestResults,
992979 test_metadata: ?TestMetadata,
993980};
......@@ -1115,10 +1102,8 @@ fn evalZigTest(
11151102 child.stdin = null;
11161103
11171104 return .{
1118 .stdout = &.{},
1119 .stderr = &.{},
1120 .stdout_null = true,
1121 .stderr_null = true,
1105 .stdout = null,
1106 .stderr = null,
11221107 .test_results = .{
11231108 .test_count = test_count,
11241109 .fail_count = fail_count,
......@@ -1204,12 +1189,8 @@ fn evalGeneric(self: *Run, child: *std.process.Child) !StdIoResult {
12041189 .none => {},
12051190 }
12061191
1207 // These are not optionals, as a workaround for
1208 // https://github.com/ziglang/zig/issues/14783
1209 var stdout_bytes: []const u8 = undefined;
1210 var stderr_bytes: []const u8 = undefined;
1211 var stdout_null = true;
1212 var stderr_null = true;
1192 var stdout_bytes: ?[]const u8 = null;
1193 var stderr_bytes: ?[]const u8 = null;
12131194
12141195 if (child.stdout) |stdout| {
12151196 if (child.stderr) |stderr| {
......@@ -1228,33 +1209,27 @@ fn evalGeneric(self: *Run, child: *std.process.Child) !StdIoResult {
12281209
12291210 stdout_bytes = try poller.fifo(.stdout).toOwnedSlice();
12301211 stderr_bytes = try poller.fifo(.stderr).toOwnedSlice();
1231 stdout_null = false;
1232 stderr_null = false;
12331212 } else {
12341213 stdout_bytes = try stdout.reader().readAllAlloc(arena, self.max_stdio_size);
1235 stdout_null = false;
12361214 }
12371215 } else if (child.stderr) |stderr| {
12381216 stderr_bytes = try stderr.reader().readAllAlloc(arena, self.max_stdio_size);
1239 stderr_null = false;
12401217 }
12411218
1242 if (!stderr_null and stderr_bytes.len > 0) {
1219 if (stderr_bytes) |bytes| if (bytes.len > 0) {
12431220 // Treat stderr as an error message.
12441221 const stderr_is_diagnostic = self.captured_stderr == null and switch (self.stdio) {
12451222 .check => |checks| !checksContainStderr(checks.items),
12461223 else => true,
12471224 };
12481225 if (stderr_is_diagnostic) {
1249 try self.step.result_error_msgs.append(arena, stderr_bytes);
1226 try self.step.result_error_msgs.append(arena, bytes);
12501227 }
1251 }
1228 };
12521229
12531230 return .{
12541231 .stdout = stdout_bytes,
12551232 .stderr = stderr_bytes,
1256 .stdout_null = stdout_null,
1257 .stderr_null = stderr_null,
12581233 .test_results = .{},
12591234 .test_metadata = null,
12601235 };