|
1 | 1 | use crate::object::*;
|
| 2 | +#[cfg(not(Py_3_13))] |
| 3 | +use crate::pyerrors::PyErr_Occurred; |
2 | 4 | use crate::pyport::Py_ssize_t;
|
3 | 5 | use std::os::raw::{c_char, c_int};
|
4 | 6 | use std::ptr::addr_of_mut;
|
@@ -58,6 +60,12 @@ extern "C" {
|
58 | 60 | pub fn PyDict_MergeFromSeq2(d: *mut PyObject, seq2: *mut PyObject, _override: c_int) -> c_int;
|
59 | 61 | #[cfg_attr(PyPy, link_name = "PyPyDict_GetItemString")]
|
60 | 62 | pub fn PyDict_GetItemString(dp: *mut PyObject, key: *const c_char) -> *mut PyObject;
|
| 63 | + #[cfg(Py_3_13)] |
| 64 | + pub fn PyDict_GetItemRef( |
| 65 | + dp: *mut PyObject, |
| 66 | + key: *mut PyObject, |
| 67 | + result: *mut *mut PyObject, |
| 68 | + ) -> c_int; |
61 | 69 | #[cfg_attr(PyPy, link_name = "PyPyDict_SetItemString")]
|
62 | 70 | pub fn PyDict_SetItemString(
|
63 | 71 | dp: *mut PyObject,
|
@@ -96,6 +104,24 @@ pub unsafe fn PyDictViewSet_Check(op: *mut PyObject) -> c_int {
|
96 | 104 | (PyDictKeys_Check(op) != 0 || PyDictItems_Check(op) != 0) as c_int
|
97 | 105 | }
|
98 | 106 |
|
| 107 | +#[cfg(not(Py_3_13))] |
| 108 | +pub unsafe fn PyDict_GetItemRef( |
| 109 | + dp: *mut PyObject, |
| 110 | + key: *mut PyObject, |
| 111 | + result: *mut *mut PyObject, |
| 112 | +) -> c_int { |
| 113 | + let item: *mut PyObject = PyDict_GetItemWithError(dp, key); |
| 114 | + if !item.is_null() { |
| 115 | + *result = Py_NewRef(item); |
| 116 | + return 1; // found |
| 117 | + } |
| 118 | + *result = std::ptr::null_mut(); |
| 119 | + if !PyErr_Occurred().is_null() { |
| 120 | + return 0; // not found |
| 121 | + } |
| 122 | + -1 |
| 123 | +} |
| 124 | + |
99 | 125 | #[cfg_attr(windows, link(name = "pythonXY"))]
|
100 | 126 | extern "C" {
|
101 | 127 | pub static mut PyDictIterKey_Type: PyTypeObject;
|
|
0 commit comments