diff --git a/newsfragments/5947.added.md b/newsfragments/5947.added.md new file mode 100644 index 00000000000..16480541f22 --- /dev/null +++ b/newsfragments/5947.added.md @@ -0,0 +1,11 @@ +Added the following functions: + +* pub fn PyDict_SetDefault(mp: *mut PyObject, key: *mut PyObject, default_obj: *mut PyObject) -> *mut PyObject; +* pub fn PyDict_SetDefaultRef(mp: *mut PyObject, key: *mut PyObject, default_obj: *mut PyObject, result: **mut PyObject) -> c_int; +* pub fn PyDict_ContainsString(mp: *mut PyObject, key: *const char) -> c_int; +* pub fn PyDict_Pop(dict: *mut PyObject, key: *mut PyObject, result: **mut PyObject) -> c_int; +* pub fn PyDict_PopString(dict: *mut PyObject, key: *const c_char, result: **mut PyObject) -> c_int; +* pub fn PyDict_ClearWatcher(watcher_id: c_int) -> c_int; +* pub fn PyDict_Watch(watcher_id: c_int, dict: *mut PyObject) -> c_int; +* pub fn PyDict_Unwatch(watcher_id: c_int, dict: *mut PyObject) -> c_int; +* pub fn PyFrozenDict_New(iterable: *mut PyObject) -> *mut PyObject; diff --git a/pyo3-ffi/src/cpython/dictobject.rs b/pyo3-ffi/src/cpython/dictobject.rs index 4c93f068e2b..cf5be14f3ee 100644 --- a/pyo3-ffi/src/cpython/dictobject.rs +++ b/pyo3-ffi/src/cpython/dictobject.rs @@ -3,6 +3,11 @@ use crate::object::*; #[cfg(not(any(PyPy, GraalPy)))] use crate::pyport::Py_ssize_t; +#[cfg(all(not(PyPy), Py_3_13))] +use std::ffi::c_char; +#[cfg(all(not(PyPy), Py_3_12))] +use std::ffi::c_int; + #[cfg(not(PyPy))] opaque_struct!(pub PyDictKeysObject); @@ -39,18 +44,52 @@ pub struct PyDictObject { _tmpkeys: *mut PyObject, } +extern_libpython! { + #[cfg(Py_3_15)] + pub fn PyFrozenDict_New(iterable: *mut PyObject) -> *mut PyObject; +} + // skipped private _PyDict_GetItem_KnownHash // skipped private _PyDict_GetItemStringWithError -// skipped PyDict_SetDefault +extern_libpython! { + #[cfg(not(GraalPy))] + pub fn PyDict_SetDefault( + mp: *mut PyObject, + key: *mut PyObject, + default_obj: *mut PyObject, + ) -> *mut PyObject; + /* + #[cfg(all(Py_3_13, not(Py_3_15)))] + pub fn PyDict_SetDefaultRef( + mp: *mut PyObject, + key: *mut PyObject, + default_obj: *mut PyObject, + result: *mut *mut PyObject, + ) -> c_int; + */ +} // skipped PyDict_GET_SIZE -// skipped PyDict_ContainsString + +extern_libpython! { + #[cfg(Py_3_13)] + pub fn PyDict_ContainsString(mp: *mut PyObject, key: *const c_char) -> c_int; +} // skipped private _PyDict_NewPresized -// skipped PyDict_Pop -// skipped PyDict_PopString +extern_libpython! { + #[cfg(Py_3_13)] + pub fn PyDict_Pop(dict: *mut PyObject, key: *mut PyObject, result: *mut *mut PyObject) + -> c_int; + #[cfg(Py_3_13)] + pub fn PyDict_PopString( + dict: *mut PyObject, + key: *const c_char, + result: *mut *mut PyObject, + ) -> c_int; +} // skipped private _PyDict_Pop @@ -60,7 +99,14 @@ pub struct PyDictObject { // skipped PyDict_WatchCallback // skipped PyDict_AddWatcher -// skipped PyDict_ClearWatcher -// skipped PyDict_Watch -// skipped PyDict_Unwatch +extern_libpython! { + #[cfg(Py_3_12)] + pub fn PyDict_ClearWatcher(watcher_id: c_int) -> c_int; + #[cfg(Py_3_12)] + #[cfg(not(GraalPy))] + pub fn PyDict_Watch(watcher_id: c_int, dict: *mut PyObject) -> c_int; + #[cfg(Py_3_12)] + #[cfg(not(GraalPy))] + pub fn PyDict_Unwatch(watcher_id: c_int, dict: *mut PyObject) -> c_int; +}