From 83f0f22efebb43b6aab473bbebfd8b0688a42924 Mon Sep 17 00:00:00 2001 From: jadedpasta Date: Tue, 9 Jan 2024 23:47:34 -0600 Subject: [PATCH] ffi: Add definition for PyType_GetModuleByDef This API is available starting in 3.11. It is not part of the Stable ABI. PyType_GetModuleByDef searches the MRO of the given type for a module matching the given module spec. It can be useful for users use that `pyo3_ffi` directly and want to support multiple interpreters/per interpreter GIL. It is useful to obtain access to the module state from special methods like `tp_new` that can't use the METH_METHOD calling convention. This API is not supported on PyPy yet, but guess the symbol name for the future. --- newsfragments/3734.added.md | 1 + pyo3-ffi/src/cpython/object.rs | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 newsfragments/3734.added.md diff --git a/newsfragments/3734.added.md b/newsfragments/3734.added.md new file mode 100644 index 00000000000..e58c2038e70 --- /dev/null +++ b/newsfragments/3734.added.md @@ -0,0 +1 @@ +Add definition for `PyType_GetModuleByDef` to `pyo3_ffi`. diff --git a/pyo3-ffi/src/cpython/object.rs b/pyo3-ffi/src/cpython/object.rs index 9f46ce62cfc..ce4f56f61d5 100644 --- a/pyo3-ffi/src/cpython/object.rs +++ b/pyo3-ffi/src/cpython/object.rs @@ -1,5 +1,7 @@ #[cfg(Py_3_8)] use crate::vectorcallfunc; +#[cfg(Py_3_11)] +use crate::PyModuleDef; use crate::{object, PyGetSetDef, PyMemberDef, PyMethodDef, PyObject, Py_ssize_t}; use std::mem; use std::os::raw::{c_char, c_int, c_uint, c_ulong, c_void}; @@ -339,9 +341,12 @@ pub unsafe fn PyHeapType_GET_MEMBERS(etype: *mut PyHeapTypeObject) -> *mut PyMem // skipped _PyType_CalculateMetaclass // skipped _PyType_GetDocFromInternalDoc // skipped _PyType_GetTextSignatureFromInternalDoc -// skipped _PyType_GetModuleByDef extern "C" { + #[cfg(Py_3_11)] + #[cfg_attr(PyPy, link_name = "PyPyType_GetModuleByDef")] + pub fn PyType_GetModuleByDef(ty: *mut PyTypeObject, def: *mut PyModuleDef) -> *mut PyObject; + #[cfg(Py_3_12)] pub fn PyType_GetDict(o: *mut PyTypeObject) -> *mut PyObject;