From c5b2b4139f1a29f7f73f17c7fa01859dd2d9ed85 Mon Sep 17 00:00:00 2001 From: "Jeong, YunWon" Date: Tue, 9 Dec 2025 00:45:35 +0900 Subject: [PATCH 1/2] fix waitstatus_to_exitcode --- Lib/test/test_os.py | 2 -- crates/vm/src/stdlib/os.rs | 35 +++++++++++++++++++---------------- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index e751b6423d6..d1a08ff4677 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -3431,7 +3431,6 @@ def test_waitstatus_to_exitcode(self): with self.assertRaises(TypeError): os.waitstatus_to_exitcode(0.0) - @unittest.expectedFailureIfWindows('TODO: RUSTPYTHON; os.spawnv not implemented yet for all platforms') @unittest.skipUnless(sys.platform == 'win32', 'win32-specific test') def test_waitpid_windows(self): # bpo-40138: test os.waitpid() and os.waitstatus_to_exitcode() @@ -3440,7 +3439,6 @@ def test_waitpid_windows(self): code = f'import _winapi; _winapi.ExitProcess({STATUS_CONTROL_C_EXIT})' self.check_waitpid(code, exitcode=STATUS_CONTROL_C_EXIT) - @unittest.expectedFailureIfWindows('TODO: RUSTPYTHON; (OverflowError: Python int too large to convert to Rust i32)') @unittest.skipUnless(sys.platform == 'win32', 'win32-specific test') def test_waitstatus_to_exitcode_windows(self): max_exitcode = 2 ** 32 - 1 diff --git a/crates/vm/src/stdlib/os.rs b/crates/vm/src/stdlib/os.rs index 45d4e41bcba..2d495f437f6 100644 --- a/crates/vm/src/stdlib/os.rs +++ b/crates/vm/src/stdlib/os.rs @@ -1421,29 +1421,32 @@ pub(super) mod _os { Ok((loadavg[0], loadavg[1], loadavg[2])) } - #[cfg(any(unix, windows))] + #[cfg(unix)] #[pyfunction] fn waitstatus_to_exitcode(status: i32, vm: &VirtualMachine) -> PyResult { let status = u32::try_from(status) .map_err(|_| vm.new_value_error(format!("invalid WEXITSTATUS: {status}")))?; - cfg_if::cfg_if! { - if #[cfg(not(windows))] { - let status = status as libc::c_int; - if libc::WIFEXITED(status) { - return Ok(libc::WEXITSTATUS(status)); - } - - if libc::WIFSIGNALED(status) { - return Ok(-libc::WTERMSIG(status)); - } + let status = status as libc::c_int; + if libc::WIFEXITED(status) { + return Ok(libc::WEXITSTATUS(status)); + } - Err(vm.new_value_error(format!("Invalid wait status: {status}"))) - } else { - i32::try_from(status.rotate_right(8)) - .map_err(|_| vm.new_value_error(format!("invalid wait status: {status}"))) - } + if libc::WIFSIGNALED(status) { + return Ok(-libc::WTERMSIG(status)); } + + Err(vm.new_value_error(format!("Invalid wait status: {status}"))) + } + + #[cfg(windows)] + #[pyfunction] + fn waitstatus_to_exitcode(status: u64, vm: &VirtualMachine) -> PyResult { + let exitcode = status >> 8; + // ExitProcess() accepts an UINT type: + // reject exit code which doesn't fit in an UINT + u32::try_from(exitcode) + .map_err(|_| vm.new_value_error(format!("invalid exit code: {exitcode}"))) } #[pyfunction] From f22bac794ab64bc7e90faa86bf729289876159af Mon Sep 17 00:00:00 2001 From: "Jeong, YunWon" Date: Tue, 9 Dec 2025 02:45:46 +0900 Subject: [PATCH 2/2] msg --- crates/vm/src/stdlib/os.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/vm/src/stdlib/os.rs b/crates/vm/src/stdlib/os.rs index 2d495f437f6..2da6ef9a2a2 100644 --- a/crates/vm/src/stdlib/os.rs +++ b/crates/vm/src/stdlib/os.rs @@ -1446,7 +1446,7 @@ pub(super) mod _os { // ExitProcess() accepts an UINT type: // reject exit code which doesn't fit in an UINT u32::try_from(exitcode) - .map_err(|_| vm.new_value_error(format!("invalid exit code: {exitcode}"))) + .map_err(|_| vm.new_value_error(format!("Invalid exit code: {exitcode}"))) } #[pyfunction]