diff --git a/lib/std/build.zig b/lib/std/build.zig index 453f20c333eb50efd51cd0d05e07c810c6999e56..38744cea1eabe4c486d4ffdc0f24c30de8b5d646 100644 --- a/lib/std/build.zig +++ b/lib/std/build.zig @@ -971,9 +971,7 @@ pub const Builder = struct { if (!std.process.can_spawn) return error.ExecNotSupported; - const child = std.ChildProcess.init(argv, self.allocator) catch unreachable; - defer child.deinit(); - + var child = std.ChildProcess.init(argv, self.allocator); child.cwd = cwd; child.env_map = env_map; @@ -1187,9 +1185,7 @@ pub const Builder = struct { return error.ExecNotSupported; const max_output_size = 400 * 1024; - const child = try std.ChildProcess.init(argv, self.allocator); - defer child.deinit(); - + var child = std.ChildProcess.init(argv, self.allocator); child.stdin_behavior = .Ignore; child.stdout_behavior = .Pipe; child.stderr_behavior = stderr_behavior; diff --git a/lib/std/build/RunStep.zig b/lib/std/build/RunStep.zig index e8544921d9ebdc8a2f9fc283d2e6032e74c56291..e00fe3deb66938d932b426345222b3113b36d8dd 100644 --- a/lib/std/build/RunStep.zig +++ b/lib/std/build/RunStep.zig @@ -184,9 +184,7 @@ fn make(step: *Step) !void { return ExecError.ExecNotSupported; } - const child = std.ChildProcess.init(argv, self.builder.allocator) catch unreachable; - defer child.deinit(); - + var child = std.ChildProcess.init(argv, self.builder.allocator); child.cwd = cwd; child.env_map = self.env_map orelse self.builder.env_map; diff --git a/lib/std/child_process.zig b/lib/std/child_process.zig index f2b978ba9f73ef23f273dcca19d043a17e7afe20..5f01ed01dd65f95d85aae202e0ad411a08c2eb55 100644 --- a/lib/std/child_process.zig +++ b/lib/std/child_process.zig @@ -98,10 +98,8 @@ pub const ChildProcess = struct { }; /// First argument in argv is the executable. - /// On success must call deinit. - pub fn init(argv: []const []const u8, allocator: mem.Allocator) !*ChildProcess { - const child = try allocator.create(ChildProcess); - child.* = ChildProcess{ + pub fn init(argv: []const []const u8, allocator: mem.Allocator) ChildProcess { + return .{ .allocator = allocator, .argv = argv, .pid = undefined, @@ -121,8 +119,6 @@ pub const ChildProcess = struct { .stderr_behavior = StdIo.Inherit, .expand_arg0 = .no_expand, }; - errdefer allocator.destroy(child); - return child; } pub fn setUserName(self: *ChildProcess, name: []const u8) !void { @@ -199,7 +195,7 @@ pub const ChildProcess = struct { }; fn collectOutputPosix( - child: *const ChildProcess, + child: ChildProcess, stdout: *std.ArrayList(u8), stderr: *std.ArrayList(u8), max_output_bytes: usize, @@ -298,7 +294,7 @@ pub const ChildProcess = struct { } } - fn collectOutputWindows(child: *const ChildProcess, outs: [2]*std.ArrayList(u8), max_output_bytes: usize) !void { + fn collectOutputWindows(child: ChildProcess, outs: [2]*std.ArrayList(u8), max_output_bytes: usize) !void { const bump_amt = 512; const handles = [_]windows.HANDLE{ child.stdout.?.handle, @@ -383,9 +379,7 @@ pub const ChildProcess = struct { max_output_bytes: usize = 50 * 1024, expand_arg0: Arg0Expand = .no_expand, }) !ExecResult { - const child = try ChildProcess.init(args.argv, args.allocator); - defer child.deinit(); - + var child = ChildProcess.init(args.argv, args.allocator); child.stdin_behavior = .Ignore; child.stdout_behavior = .Pipe; child.stderr_behavior = .Pipe; @@ -452,10 +446,6 @@ pub const ChildProcess = struct { return self.term.?; } - pub fn deinit(self: *ChildProcess) void { - self.allocator.destroy(self); - } - fn waitUnwrappedWindows(self: *ChildProcess) !void { const result = windows.WaitForSingleObjectEx(self.handle, windows.INFINITE, false); @@ -1374,8 +1364,7 @@ test "build and call child_process" { // spawn compiled file as child_process with argument 'hello world' + expect success const args = [_][]const u8{ child_path, "hello world" }; - var child_proc = try ChildProcess.init(&args, allocator); - defer child_proc.deinit(); + var child_proc = ChildProcess.init(&args, allocator); const ret_val = try child_proc.spawnAndWait(); try testing.expectEqual(ret_val, .{ .Exited = 0 }); } @@ -1385,11 +1374,10 @@ test "creating a child process with stdin and stdout behavior set to StdIo.Pipe" const testing = std.testing; const allocator = testing.allocator; - var child_process = try std.ChildProcess.init( + var child_process = std.ChildProcess.init( &[_][]const u8{ testing.zig_exe_path, "fmt", "--stdin" }, allocator, ); - defer child_process.deinit(); child_process.stdin_behavior = .Pipe; child_process.stdout_behavior = .Pipe; diff --git a/lib/std/testing.zig b/lib/std/testing.zig index cfdf300c045dbafcff2a99bae3fa7c29d0addca5..174e898bcae4589de488e71a8891a7f225228626 100644 --- a/lib/std/testing.zig +++ b/lib/std/testing.zig @@ -442,10 +442,11 @@ pub fn buildExe(zigexec: []const u8, zigfile: []const u8, binfile: []const u8) ! const flag_emit = "-femit-bin="; const cmd_emit = try std.mem.concat(allocator, u8, &[_][]const u8{ flag_emit, binfile }); defer allocator.free(cmd_emit); + const args = [_][]const u8{ zigexec, "build-exe", zigfile, cmd_emit }; - var procCompileChild = try std.ChildProcess.init(&args, allocator); - defer procCompileChild.deinit(); + var procCompileChild = std.ChildProcess.init(&args, allocator); try procCompileChild.spawn(); + const ret_val = try procCompileChild.wait(); try expectEqual(ret_val, .{ .Exited = 0 }); } diff --git a/src/Compilation.zig b/src/Compilation.zig index b0c8f5f475698c6deb6a8a6f670bae65aab0faa9..2ad8a9e0300537b61d8b1a8c5491a3d9f104d74c 100644 --- a/src/Compilation.zig +++ b/src/Compilation.zig @@ -3611,9 +3611,7 @@ fn updateCObject(comp: *Compilation, c_object: *CObject, c_obj_prog_node: *std.P } if (std.process.can_spawn) { - const child = try std.ChildProcess.init(argv.items, arena); - defer child.deinit(); - + var child = std.ChildProcess.init(argv.items, arena); if (comp.clang_passthrough_mode) { child.stdin_behavior = .Inherit; child.stdout_behavior = .Inherit; diff --git a/src/link/Coff.zig b/src/link/Coff.zig index 246918515dd2cd993944f77109e6cf24244a7a81..178a6ab6b49c30c798c89788964b19e0225d92c6 100644 --- a/src/link/Coff.zig +++ b/src/link/Coff.zig @@ -1390,9 +1390,7 @@ fn linkWithLLD(self: *Coff, comp: *Compilation, prog_node: *std.Progress.Node) ! // If possible, we run LLD as a child process because it does not always // behave properly as a library, unfortunately. // https://github.com/ziglang/zig/issues/3825 - const child = try std.ChildProcess.init(argv.items, arena); - defer child.deinit(); - + var child = std.ChildProcess.init(argv.items, arena); if (comp.clang_passthrough_mode) { child.stdin_behavior = .Inherit; child.stdout_behavior = .Inherit; diff --git a/src/link/Elf.zig b/src/link/Elf.zig index 144ac24b9bc38be875dd4cc3df6ce98c36d19bf6..11a701fcf9cd33176337391b4bd258dd7d36d8dc 100644 --- a/src/link/Elf.zig +++ b/src/link/Elf.zig @@ -1754,9 +1754,7 @@ fn linkWithLLD(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node) !v // If possible, we run LLD as a child process because it does not always // behave properly as a library, unfortunately. // https://github.com/ziglang/zig/issues/3825 - const child = try std.ChildProcess.init(argv.items, arena); - defer child.deinit(); - + var child = std.ChildProcess.init(argv.items, arena); if (comp.clang_passthrough_mode) { child.stdin_behavior = .Inherit; child.stdout_behavior = .Inherit; diff --git a/src/link/Wasm.zig b/src/link/Wasm.zig index 3c53e915876c7845a342bcd4c28c3ee8931d1ea7..4e898cee07ed06920a278a1d786c42697947b3af 100644 --- a/src/link/Wasm.zig +++ b/src/link/Wasm.zig @@ -2405,9 +2405,7 @@ fn linkWithLLD(self: *Wasm, comp: *Compilation, prog_node: *std.Progress.Node) ! // If possible, we run LLD as a child process because it does not always // behave properly as a library, unfortunately. // https://github.com/ziglang/zig/issues/3825 - const child = try std.ChildProcess.init(argv.items, arena); - defer child.deinit(); - + var child = std.ChildProcess.init(argv.items, arena); if (comp.clang_passthrough_mode) { child.stdin_behavior = .Inherit; child.stdout_behavior = .Inherit; diff --git a/src/main.zig b/src/main.zig index e47ff0e272fbd5141b89580938706683da6b09e4..1538e862250bff5ae93dafad35bb7433198d5f05 100644 --- a/src/main.zig +++ b/src/main.zig @@ -3012,9 +3012,7 @@ fn runOrTest( const cmd = try std.mem.join(arena, " ", argv.items); fatal("the following command failed to execve with '{s}':\n{s}", .{ @errorName(err), cmd }); } else if (std.process.can_spawn) { - const child = try std.ChildProcess.init(argv.items, gpa); - defer child.deinit(); - + var child = std.ChildProcess.init(argv.items, gpa); child.stdin_behavior = .Inherit; child.stdout_behavior = .Inherit; child.stderr_behavior = .Inherit; @@ -3700,9 +3698,7 @@ pub fn cmdBuild(gpa: Allocator, arena: Allocator, args: []const []const u8) !voi }; if (std.process.can_spawn) { - const child = try std.ChildProcess.init(child_argv, gpa); - defer child.deinit(); - + var child = std.ChildProcess.init(child_argv, gpa); child.stdin_behavior = .Inherit; child.stdout_behavior = .Inherit; child.stderr_behavior = .Inherit; diff --git a/src/mingw.zig b/src/mingw.zig index 84ec0795f1d168271e6a5824990e039f52e94923..e99a1af8fc6b5a72b5b4693fea629929275916df 100644 --- a/src/mingw.zig +++ b/src/mingw.zig @@ -369,9 +369,7 @@ pub fn buildImportLib(comp: *Compilation, lib_name: []const u8) !void { } if (std.process.can_spawn) { - const child = try std.ChildProcess.init(&args, arena); - defer child.deinit(); - + var child = std.ChildProcess.init(&args, arena); child.stdin_behavior = .Ignore; child.stdout_behavior = .Pipe; child.stderr_behavior = .Pipe; diff --git a/test/tests.zig b/test/tests.zig index 5b15da2bcb2448181838e52e6f3f7680f1640624..ee4b92202184de9d7d0f08c0df4d4d19864e5a6f 100644 --- a/test/tests.zig +++ b/test/tests.zig @@ -731,9 +731,7 @@ pub const StackTracesContext = struct { return ExecError.ExecNotSupported; } - const child = std.ChildProcess.init(args.items, b.allocator) catch unreachable; - defer child.deinit(); - + var child = std.ChildProcess.init(args.items, b.allocator); child.stdin_behavior = .Ignore; child.stdout_behavior = .Pipe; child.stderr_behavior = .Pipe;