diff --git a/newsfragments/5737.added.md b/newsfragments/5737.added.md new file mode 100644 index 00000000000..e7468d210c3 --- /dev/null +++ b/newsfragments/5737.added.md @@ -0,0 +1 @@ +Add FFI definitions `PyImport_ImportModuleAttr` and `PyImport_ImportModuleAttrString` on Python 3.14+. diff --git a/newsfragments/5737.changed.md b/newsfragments/5737.changed.md new file mode 100644 index 00000000000..775e4975287 --- /dev/null +++ b/newsfragments/5737.changed.md @@ -0,0 +1 @@ +Deprecate FFI definition `PyImport_ImportModuleNoBlock` (deprecated in Python 3.13). diff --git a/newsfragments/5737.fixed.md b/newsfragments/5737.fixed.md new file mode 100644 index 00000000000..61bc0248439 --- /dev/null +++ b/newsfragments/5737.fixed.md @@ -0,0 +1 @@ +Fix FFI definition `PyImport_GetModule` on PyPy. diff --git a/newsfragments/5737.removed.md b/newsfragments/5737.removed.md new file mode 100644 index 00000000000..1a966742666 --- /dev/null +++ b/newsfragments/5737.removed.md @@ -0,0 +1 @@ +Remove private FFI definitions `_PyImport_IsInitialized`, `_PyImport_SetModule`, `_PyImport_SetModuleString`, `_PyImport_AcquireLock`, `_PyImport_ReleaseLock`, `_PyImport_FindBuiltin`, `_PyImport_FindExtensionObject`, `_PyImport_FixupBuiltin`, and `_PyImport_FixupExtensionObject`. diff --git a/pyo3-ffi/src/cpython/import.rs b/pyo3-ffi/src/cpython/import.rs index 3b9374f68e3..754a0be8744 100644 --- a/pyo3-ffi/src/cpython/import.rs +++ b/pyo3-ffi/src/cpython/import.rs @@ -1,34 +1,8 @@ -use crate::{PyInterpreterState, PyObject}; +use crate::PyObject; #[cfg(not(PyPy))] use std::ffi::c_uchar; use std::ffi::{c_char, c_int}; -// skipped PyInit__imp - -extern "C" { - pub fn _PyImport_IsInitialized(state: *mut PyInterpreterState) -> c_int; - // skipped _PyImport_GetModuleId - pub fn _PyImport_SetModule(name: *mut PyObject, module: *mut PyObject) -> c_int; - pub fn _PyImport_SetModuleString(name: *const c_char, module: *mut PyObject) -> c_int; - pub fn _PyImport_AcquireLock(); - pub fn _PyImport_ReleaseLock() -> c_int; - #[cfg(not(Py_3_9))] - pub fn _PyImport_FindBuiltin(name: *const c_char, modules: *mut PyObject) -> *mut PyObject; - #[cfg(not(Py_3_11))] - pub fn _PyImport_FindExtensionObject(a: *mut PyObject, b: *mut PyObject) -> *mut PyObject; - pub fn _PyImport_FixupBuiltin( - module: *mut PyObject, - name: *const c_char, - modules: *mut PyObject, - ) -> c_int; - pub fn _PyImport_FixupExtensionObject( - a: *mut PyObject, - b: *mut PyObject, - c: *mut PyObject, - d: *mut PyObject, - ) -> c_int; -} - #[cfg(not(PyPy))] #[repr(C)] #[derive(Copy, Clone)] @@ -41,9 +15,7 @@ pub struct _inittab { extern "C" { #[cfg(not(PyPy))] pub static mut PyImport_Inittab: *mut _inittab; -} -extern "C" { #[cfg(not(PyPy))] pub fn PyImport_ExtendInittab(newtab: *mut _inittab) -> c_int; } @@ -65,8 +37,15 @@ pub struct _frozen { extern "C" { #[cfg(not(PyPy))] pub static mut PyImport_FrozenModules: *const _frozen; -} -// skipped _PyImport_FrozenBootstrap -// skipped _PyImport_FrozenStdlib -// skipped _PyImport_FrozenTest + #[cfg(Py_3_14)] + pub fn PyImport_ImportModuleAttr( + mod_name: *mut PyObject, + attr_name: *mut PyObject, + ) -> *mut PyObject; + #[cfg(Py_3_14)] + pub fn PyImport_ImportModuleAttrString( + mod_name: *const c_char, + attr_name: *const c_char, + ) -> *mut PyObject; +} diff --git a/pyo3-ffi/src/import.rs b/pyo3-ffi/src/import.rs index ce224af28e1..8ddb70218ec 100644 --- a/pyo3-ffi/src/import.rs +++ b/pyo3-ffi/src/import.rs @@ -26,7 +26,8 @@ extern "C" { ) -> *mut PyObject; #[cfg_attr(PyPy, link_name = "PyPyImport_GetModuleDict")] pub fn PyImport_GetModuleDict() -> *mut PyObject; - // skipped Python 3.7 / ex-non-limited PyImport_GetModule + #[cfg_attr(PyPy, link_name = "PyPyImport_GetModule")] + pub fn PyImport_GetModule(name: *mut PyObject) -> *mut PyObject; pub fn PyImport_AddModuleObject(name: *mut PyObject) -> *mut PyObject; #[cfg_attr(PyPy, link_name = "PyPyImport_AddModule")] pub fn PyImport_AddModule(name: *const c_char) -> *mut PyObject; @@ -35,6 +36,7 @@ extern "C" { pub fn PyImport_AddModuleRef(name: *const c_char) -> *mut PyObject; #[cfg_attr(PyPy, link_name = "PyPyImport_ImportModule")] pub fn PyImport_ImportModule(name: *const c_char) -> *mut PyObject; + #[deprecated(note = "Python 3.13")] #[cfg_attr(PyPy, link_name = "PyPyImport_ImportModuleNoBlock")] pub fn PyImport_ImportModuleNoBlock(name: *const c_char) -> *mut PyObject; #[cfg_attr(PyPy, link_name = "PyPyImport_ImportModuleLevel")]