diff --git a/qt/launcher/src/platform/nix.rs b/qt/launcher/src/platform/nix.rs index bac8c45c3..83a587493 100644 --- a/qt/launcher/src/platform/nix.rs +++ b/qt/launcher/src/platform/nix.rs @@ -23,7 +23,7 @@ impl Drop for PyFfi { } macro_rules! load_sym { - ($lib:expr, $name:literal) => {{ + ($lib:expr, $name:expr) => {{ libc::dlerror(); let sym = libc::dlsym($lib, $name.as_ptr()); if sym.is_null() { @@ -34,9 +34,16 @@ macro_rules! load_sym { }}; } +macro_rules! ffi { + ($lib:expr, $exec:expr, $($field:ident),* $(,)?) => { + #[allow(clippy::missing_transmute_annotations)] // they're not missing + PyFfi { exec: $exec, $($field: load_sym!($lib, ::std::ffi::CString::new(stringify!($field)).unwrap()),)* lib: $lib, } + }; +} + impl PyFfi { #[allow(non_snake_case)] - pub fn load(path: impl AsRef) -> Result { + pub fn load(path: impl AsRef, exec: CString) -> Result { unsafe { libc::dlerror(); let lib = libc::dlopen( @@ -48,14 +55,18 @@ impl PyFfi { anyhow::bail!("failed to load library: {dlerror_str}"); } - #[allow(clippy::missing_transmute_annotations)] // they're not missing - Ok(PyFfi { - Py_InitializeEx: load_sym!(lib, c"Py_InitializeEx"), - Py_IsInitialized: load_sym!(lib, c"Py_IsInitialized"), - PyRun_SimpleString: load_sym!(lib, c"PyRun_SimpleString"), - Py_FinalizeEx: load_sym!(lib, c"Py_FinalizeEx"), + Ok(ffi!( lib, - }) + exec, + Py_IsInitialized, + PyRun_SimpleString, + Py_FinalizeEx, + PyConfig_InitPythonConfig, + PyConfig_SetBytesString, + Py_InitializeFromConfig, + PyConfig_SetBytesArgv, + PyStatus_Exception + )) } } } diff --git a/qt/launcher/src/platform/windows.rs b/qt/launcher/src/platform/windows.rs index bae66f83e..807aaa3e0 100644 --- a/qt/launcher/src/platform/windows.rs +++ b/qt/launcher/src/platform/windows.rs @@ -286,7 +286,7 @@ impl Drop for PyFfi { } macro_rules! load_sym { - ($lib:expr, $name:literal) => { + ($lib:expr, $name:expr) => { std::mem::transmute( GetProcAddress($lib, PCSTR::from_raw($name.as_ptr().cast())) .ok_or_else(|| anyhow!("failed to load {}", $name.to_string_lossy()))?, @@ -294,9 +294,16 @@ macro_rules! load_sym { }; } +macro_rules! ffi { + ($lib:expr, $exec:expr, $($field:ident),* $(,)?) => { + #[allow(clippy::missing_transmute_annotations)] // they're not missing + PyFfi { exec: $exec, $($field: load_sym!($lib, ::std::ffi::CString::new(stringify!($field)).unwrap()),)* lib: $lib.0, } + }; +} + impl PyFfi { #[allow(non_snake_case)] - pub fn load(path: impl AsRef) -> Result { + pub fn load(path: impl AsRef, exec: CString) -> Result { unsafe { let wide_filename: Vec = path .as_ref() @@ -311,13 +318,17 @@ impl PyFfi { LOAD_LIBRARY_FLAGS::default(), )?; - #[allow(clippy::missing_transmute_annotations)] // they're not missing - Ok(PyFfi { - Py_InitializeEx: load_sym!(lib, c"Py_InitializeEx"), - Py_IsInitialized: load_sym!(lib, c"Py_IsInitialized"), - PyRun_SimpleString: load_sym!(lib, c"PyRun_SimpleString"), - Py_FinalizeEx: load_sym!(lib, c"Py_FinalizeEx"), - lib: lib.0, + Ok(ffi! { + lib, + exec, + Py_IsInitialized, + PyRun_SimpleString, + Py_FinalizeEx, + PyConfig_InitPythonConfig, + PyConfig_SetBytesString, + Py_InitializeFromConfig, + PyConfig_SetBytesArgv, + PyStatus_Exception, }) } }