@@ -433,7 +433,7 @@ pub const ChildProcess = struct {
433433 }
434434
435435 fn spawnWindows (self : & ChildProcess ) - > % void {
436- var saAttr = windows.SECURITY_ATTRIBUTES {
436+ const saAttr = windows.SECURITY_ATTRIBUTES {
437437 .nLength = @sizeOf (windows .SECURITY_ATTRIBUTES ),
438438 .bInheritHandle = windows .TRUE ,
439439 .lpSecurityDescriptor = null ,
@@ -459,7 +459,7 @@ pub const ChildProcess = struct {
459459 var g_hChildStd_IN_Wr : ? windows.HANDLE = null ;
460460 switch (self .stdin_behavior ) {
461461 StdIo .Pipe = > {
462- % return windowsMakePipeIn (& g_hChildStd_IN_Rd , & g_hChildStd_IN_Wr , & saAttr );
462+ % return windowsMakePipeIn (& g_hChildStd_IN_Rd , & g_hChildStd_IN_Wr , saAttr );
463463 },
464464 StdIo .Ignore = > {
465465 g_hChildStd_IN_Rd = nul_handle ;
@@ -477,7 +477,7 @@ pub const ChildProcess = struct {
477477 var g_hChildStd_OUT_Wr : ? windows.HANDLE = null ;
478478 switch (self .stdout_behavior ) {
479479 StdIo .Pipe = > {
480- % return windowsMakePipeOut (& g_hChildStd_OUT_Rd , & g_hChildStd_OUT_Wr , & saAttr );
480+ % return windowsMakePipeOut (& g_hChildStd_OUT_Rd , & g_hChildStd_OUT_Wr , saAttr );
481481 },
482482 StdIo .Ignore = > {
483483 g_hChildStd_OUT_Wr = nul_handle ;
@@ -495,7 +495,7 @@ pub const ChildProcess = struct {
495495 var g_hChildStd_ERR_Wr : ? windows.HANDLE = null ;
496496 switch (self .stderr_behavior ) {
497497 StdIo .Pipe = > {
498- % return windowsMakePipeOut (& g_hChildStd_ERR_Rd , & g_hChildStd_ERR_Wr , & saAttr );
498+ % return windowsMakePipeOut (& g_hChildStd_ERR_Rd , & g_hChildStd_ERR_Wr , saAttr );
499499 },
500500 StdIo .Ignore = > {
501501 g_hChildStd_ERR_Wr = nul_handle ;
@@ -675,7 +675,12 @@ fn windowsDestroyPipe(rd: ?windows.HANDLE, wr: ?windows.HANDLE) {
675675 if (wr ) | h | os .windowsClose (h );
676676}
677677
678- fn windowsMakePipe (rd : & windows.HANDLE , wr : & windows.HANDLE , sattr : & windows.SECURITY_ATTRIBUTES ) - > % void {
678+
679+ // TODO: workaround for bug where the `const` from `&const` is dropped when the type is
680+ // a namespace field lookup
681+ const SECURITY_ATTRIBUTES = windows.SECURITY_ATTRIBUTES ;
682+
683+ fn windowsMakePipe (rd : & windows.HANDLE , wr : & windows.HANDLE , sattr : & const SECURITY_ATTRIBUTES ) - > % void {
679684 if (windows .CreatePipe (rd , wr , sattr , 0 ) == 0 ) {
680685 const err = windows .GetLastError ();
681686 return switch (err ) {
@@ -693,19 +698,21 @@ fn windowsSetHandleInfo(h: windows.HANDLE, mask: windows.DWORD, flags: windows.D
693698 }
694699}
695700
696- fn windowsMakePipeIn (rd : &? windows.HANDLE , wr : &? windows.HANDLE , sattr : & windows. SECURITY_ATTRIBUTES ) - > % void {
701+ fn windowsMakePipeIn (rd : &? windows.HANDLE , wr : &? windows.HANDLE , sattr : & const SECURITY_ATTRIBUTES ) - > % void {
697702 var rd_h : windows.HANDLE = undefined ;
698703 var wr_h : windows.HANDLE = undefined ;
699704 % return windowsMakePipe (& rd_h , & wr_h , sattr );
705+ % defer windowsDestroyPipe (rd_h , wr_h );
700706 % return windowsSetHandleInfo (wr_h , windows .HANDLE_FLAG_INHERIT , 0 );
701707 * rd = rd_h ;
702708 * wr = wr_h ;
703709}
704710
705- fn windowsMakePipeOut (rd : &? windows.HANDLE , wr : &? windows.HANDLE , sattr : & windows. SECURITY_ATTRIBUTES ) - > % void {
711+ fn windowsMakePipeOut (rd : &? windows.HANDLE , wr : &? windows.HANDLE , sattr : & const SECURITY_ATTRIBUTES ) - > % void {
706712 var rd_h : windows.HANDLE = undefined ;
707713 var wr_h : windows.HANDLE = undefined ;
708714 % return windowsMakePipe (& rd_h , & wr_h , sattr );
715+ % defer windowsDestroyPipe (rd_h , wr_h );
709716 % return windowsSetHandleInfo (rd_h , windows .HANDLE_FLAG_INHERIT , 0 );
710717 * rd = rd_h ;
711718 * wr = wr_h ;
0 commit comments