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 37991ee4ebe..f6f0887bc7c 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,20 +44,49 @@ pub struct PyDictObject { _tmpkeys: *mut PyObject, } +extern_libpython! { + 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; + */ + #[cfg(Py_3_13)] + pub fn PyDict_ContainsString(mp: *mut PyObject, key: *const c_char) -> c_int; + #[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; + #[cfg(Py_3_12)] + pub fn PyDict_ClearWatcher(watcher_id: c_int) -> c_int; + #[cfg(Py_3_12)] + pub fn PyDict_Watch(watcher_id: c_int, dict: *mut PyObject) -> c_int; + #[cfg(Py_3_12)] + pub fn PyDict_Unwatch(watcher_id: c_int, dict: *mut PyObject) -> c_int; + #[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 -// skipped PyDict_SetDefaultRef - // skipped PyDict_GET_SIZE -// skipped PyDict_ContainsString // skipped private _PyDict_NewPresized -// skipped PyDict_Pop -// skipped PyDict_PopString - // skipped private _PyDict_Pop // skipped PY_FOREACH_DICT_EVENT @@ -61,7 +95,3 @@ pub struct PyDictObject { // skipped PyDict_WatchCallback // skipped PyDict_AddWatcher -// skipped PyDict_ClearWatcher - -// skipped PyDict_Watch -// skipped PyDict_Unwatch diff --git a/pyo3-ffi/src/dictobject.rs b/pyo3-ffi/src/dictobject.rs index 4afa2ffb5e8..446bfd7bf71 100644 --- a/pyo3-ffi/src/dictobject.rs +++ b/pyo3-ffi/src/dictobject.rs @@ -78,6 +78,13 @@ extern_libpython! { key: *const c_char, result: *mut *mut PyObject, ) -> c_int; + #[cfg(all(Py_3_13, not(Py_LIMITED_API)))] + pub fn PyDict_SetDefaultRef( + mp: *mut PyObject, + key: *mut PyObject, + default_obj: *mut PyObject, + result: *mut *mut PyObject, + ) -> c_int; // skipped 3.10 / ex-non-limited PyObject_GenericGetDict }