@@ -958,6 +958,33 @@ impl<C: widestring::UChar> IntoPyException for widestring::NulError<C> {
958958 }
959959}
960960
961+ #[ cfg( not( target_arch = "wasm32" ) ) ]
962+ pub ( crate ) fn raw_os_error_to_exc_type ( errno : i32 , vm : & VirtualMachine ) -> Option < PyTypeRef > {
963+ use crate :: stdlib:: errno:: errors;
964+ let excs = & vm. ctx . exceptions ;
965+ match errno {
966+ errors:: EWOULDBLOCK => Some ( excs. blocking_io_error . clone ( ) ) ,
967+ errors:: EALREADY => Some ( excs. blocking_io_error . clone ( ) ) ,
968+ errors:: EINPROGRESS => Some ( excs. blocking_io_error . clone ( ) ) ,
969+ errors:: EPIPE => Some ( excs. broken_pipe_error . clone ( ) ) ,
970+ errors:: ESHUTDOWN => Some ( excs. broken_pipe_error . clone ( ) ) ,
971+ errors:: ECHILD => Some ( excs. child_process_error . clone ( ) ) ,
972+ errors:: ECONNABORTED => Some ( excs. connection_aborted_error . clone ( ) ) ,
973+ errors:: ECONNREFUSED => Some ( excs. connection_refused_error . clone ( ) ) ,
974+ errors:: ECONNRESET => Some ( excs. connection_reset_error . clone ( ) ) ,
975+ errors:: EEXIST => Some ( excs. file_exists_error . clone ( ) ) ,
976+ errors:: ENOENT => Some ( excs. file_not_found_error . clone ( ) ) ,
977+ errors:: EISDIR => Some ( excs. is_a_directory_error . clone ( ) ) ,
978+ errors:: ENOTDIR => Some ( excs. not_a_directory_error . clone ( ) ) ,
979+ errors:: EINTR => Some ( excs. interrupted_error . clone ( ) ) ,
980+ errors:: EACCES => Some ( excs. permission_error . clone ( ) ) ,
981+ errors:: EPERM => Some ( excs. permission_error . clone ( ) ) ,
982+ errors:: ESRCH => Some ( excs. process_lookup_error . clone ( ) ) ,
983+ errors:: ETIMEDOUT => Some ( excs. timeout_error . clone ( ) ) ,
984+ _ => None ,
985+ }
986+ }
987+
961988pub ( super ) mod types {
962989 use crate :: common:: lock:: PyRwLock ;
963990 use crate :: {
@@ -1166,51 +1193,16 @@ pub(super) mod types {
11661193 fn os_error_optional_new (
11671194 args : Vec < PyObjectRef > ,
11681195 vm : & VirtualMachine ,
1169- ) -> Option < PyResult < PyBaseExceptionRef > > {
1170- use crate :: stdlib:: errno:: errors;
1171-
1196+ ) -> Option < PyBaseExceptionRef > {
11721197 let len = args. len ( ) ;
11731198 if len >= 2 {
11741199 let args = args. as_slice ( ) ;
11751200 let errno = & args[ 0 ] ;
1176- let error = match errno. payload_if_subclass :: < PyInt > ( vm) {
1177- Some ( errno) => match errno. try_to_primitive :: < i32 > ( vm) {
1178- Ok ( errno) => {
1179- let excs = & vm. ctx . exceptions ;
1180- let error = match errno {
1181- errors:: EWOULDBLOCK => Some ( excs. blocking_io_error . clone ( ) ) ,
1182- errors:: EALREADY => Some ( excs. blocking_io_error . clone ( ) ) ,
1183- errors:: EINPROGRESS => Some ( excs. blocking_io_error . clone ( ) ) ,
1184- errors:: EPIPE => Some ( excs. broken_pipe_error . clone ( ) ) ,
1185- errors:: ESHUTDOWN => Some ( excs. broken_pipe_error . clone ( ) ) ,
1186- errors:: ECHILD => Some ( excs. child_process_error . clone ( ) ) ,
1187- errors:: ECONNABORTED => Some ( excs. connection_aborted_error . clone ( ) ) ,
1188- errors:: ECONNREFUSED => Some ( excs. connection_refused_error . clone ( ) ) ,
1189- errors:: ECONNRESET => Some ( excs. connection_reset_error . clone ( ) ) ,
1190- errors:: EEXIST => Some ( excs. file_exists_error . clone ( ) ) ,
1191- errors:: ENOENT => Some ( excs. file_not_found_error . clone ( ) ) ,
1192- errors:: EISDIR => Some ( excs. is_a_directory_error . clone ( ) ) ,
1193- errors:: ENOTDIR => Some ( excs. not_a_directory_error . clone ( ) ) ,
1194- errors:: EINTR => Some ( excs. interrupted_error . clone ( ) ) ,
1195- errors:: EACCES => Some ( excs. permission_error . clone ( ) ) ,
1196- errors:: EPERM => Some ( excs. permission_error . clone ( ) ) ,
1197- errors:: ESRCH => Some ( excs. process_lookup_error . clone ( ) ) ,
1198- errors:: ETIMEDOUT => Some ( excs. timeout_error . clone ( ) ) ,
1199- _ => None ,
1200- } ;
1201-
1202- if error. is_some ( ) {
1203- Some ( vm. invoke_exception ( error?, args. to_vec ( ) ) )
1204- } else {
1205- None
1206- }
1207- }
1208- Err ( _) => None ,
1209- } ,
1210- None => None ,
1211- } ;
1212-
1213- error
1201+ errno
1202+ . payload_if_subclass :: < PyInt > ( vm)
1203+ . and_then ( |errno| errno. try_to_primitive :: < i32 > ( vm) . ok ( ) )
1204+ . and_then ( |errno| super :: raw_os_error_to_exc_type ( errno, vm) )
1205+ . and_then ( |typ| vm. invoke_exception ( typ, args. to_vec ( ) ) . ok ( ) )
12141206 } else {
12151207 None
12161208 }
@@ -1222,7 +1214,7 @@ pub(super) mod types {
12221214 // See: `BaseException_new`
12231215 if cls. name ( ) . deref ( ) == vm. ctx . exceptions . os_error . name ( ) . deref ( ) {
12241216 match os_error_optional_new ( args. args . to_vec ( ) , vm) {
1225- Some ( error) => error. unwrap ( ) . into_pyresult ( vm) ,
1217+ Some ( error) => error. into_pyresult ( vm) ,
12261218 None => PyBaseException :: slot_new ( cls, args, vm) ,
12271219 }
12281220 } else {
0 commit comments