rustpython_common/
macros.rs

1/// Suppress the MSVC invalid parameter handler, which by default crashes the process. Does nothing
2/// on non-MSVC targets.
3#[macro_export]
4macro_rules! suppress_iph {
5    ($e:expr) => {
6        $crate::__suppress_iph_impl!($e)
7    };
8}
9
10#[macro_export]
11#[doc(hidden)]
12#[cfg(all(windows, target_env = "msvc"))]
13macro_rules! __suppress_iph_impl {
14    ($e:expr) => {{
15        let old = $crate::__macro_private::_set_thread_local_invalid_parameter_handler(
16            $crate::__macro_private::silent_iph_handler,
17        );
18        let ret = $e;
19        $crate::__macro_private::_set_thread_local_invalid_parameter_handler(old);
20        ret
21    }};
22}
23
24#[cfg(not(all(windows, target_env = "msvc")))]
25#[macro_export]
26#[doc(hidden)]
27macro_rules! __suppress_iph_impl {
28    ($e:expr) => {
29        $e
30    };
31}
32
33#[doc(hidden)]
34pub mod __macro_private {
35    #[cfg(target_env = "msvc")]
36    type InvalidParamHandler = extern "C" fn(
37        *const libc::wchar_t,
38        *const libc::wchar_t,
39        *const libc::wchar_t,
40        libc::c_uint,
41        libc::uintptr_t,
42    );
43    #[cfg(target_env = "msvc")]
44    extern "C" {
45        pub fn _set_thread_local_invalid_parameter_handler(
46            pNew: InvalidParamHandler,
47        ) -> InvalidParamHandler;
48    }
49
50    #[cfg(target_env = "msvc")]
51    pub extern "C" fn silent_iph_handler(
52        _: *const libc::wchar_t,
53        _: *const libc::wchar_t,
54        _: *const libc::wchar_t,
55        _: libc::c_uint,
56        _: libc::uintptr_t,
57    ) {
58    }
59}