1 | use crate::object::*; |
2 | use crate::pyport::Py_ssize_t; |
3 | use std::os::raw::{c_char, c_int}; |
4 | use std::ptr::addr_of_mut; |
5 | |
6 | #[cfg_attr (windows, link(name = "pythonXY" ))] |
7 | unsafeextern "C" { |
8 | #[cfg_attr (PyPy, link_name = "PyPyDict_Type" )] |
9 | pub unsafestatic mut PyDict_Type: PyTypeObject; |
10 | } |
11 | |
12 | #[inline ] |
13 | pub unsafe fn PyDict_Check(op: *mut PyObject) -> c_int { |
14 | PyType_FastSubclass(t:Py_TYPE(op), Py_TPFLAGS_DICT_SUBCLASS) |
15 | } |
16 | |
17 | #[inline ] |
18 | pub unsafe fn PyDict_CheckExact(op: *mut PyObject) -> c_int { |
19 | (Py_TYPE(ob:op) == addr_of_mut!(PyDict_Type)) as c_int |
20 | } |
21 | |
22 | unsafeextern "C" { |
23 | #[cfg_attr (PyPy, link_name = "PyPyDict_New" )] |
24 | pub unsafefn PyDict_New() -> *mut PyObject; |
25 | #[cfg_attr (PyPy, link_name = "PyPyDict_GetItem" )] |
26 | pub unsafefn PyDict_GetItem(mp: *mut PyObject, key: *mut PyObject) -> *mut PyObject; |
27 | #[cfg_attr (PyPy, link_name = "PyPyDict_GetItemWithError" )] |
28 | pub unsafefn PyDict_GetItemWithError(mp: *mut PyObject, key: *mut PyObject) -> *mut PyObject; |
29 | #[cfg_attr (PyPy, link_name = "PyPyDict_SetItem" )] |
30 | pub unsafefn PyDict_SetItem(mp: *mut PyObject, key: *mut PyObject, item: *mut PyObject) -> c_int; |
31 | #[cfg_attr (PyPy, link_name = "PyPyDict_DelItem" )] |
32 | pub unsafefn PyDict_DelItem(mp: *mut PyObject, key: *mut PyObject) -> c_int; |
33 | #[cfg_attr (PyPy, link_name = "PyPyDict_Clear" )] |
34 | pub unsafefn PyDict_Clear(mp: *mut PyObject); |
35 | #[cfg_attr (PyPy, link_name = "PyPyDict_Next" )] |
36 | pub unsafefn PyDict_Next( |
37 | mp: *mut PyObject, |
38 | pos: *mut Py_ssize_t, |
39 | key: *mut *mut PyObject, |
40 | value: *mut *mut PyObject, |
41 | ) -> c_int; |
42 | #[cfg_attr (PyPy, link_name = "PyPyDict_Keys" )] |
43 | pub unsafefn PyDict_Keys(mp: *mut PyObject) -> *mut PyObject; |
44 | #[cfg_attr (PyPy, link_name = "PyPyDict_Values" )] |
45 | pub unsafefn PyDict_Values(mp: *mut PyObject) -> *mut PyObject; |
46 | #[cfg_attr (PyPy, link_name = "PyPyDict_Items" )] |
47 | pub unsafefn PyDict_Items(mp: *mut PyObject) -> *mut PyObject; |
48 | #[cfg_attr (PyPy, link_name = "PyPyDict_Size" )] |
49 | pub unsafefn PyDict_Size(mp: *mut PyObject) -> Py_ssize_t; |
50 | #[cfg_attr (PyPy, link_name = "PyPyDict_Copy" )] |
51 | pub unsafefn PyDict_Copy(mp: *mut PyObject) -> *mut PyObject; |
52 | #[cfg_attr (PyPy, link_name = "PyPyDict_Contains" )] |
53 | pub unsafefn PyDict_Contains(mp: *mut PyObject, key: *mut PyObject) -> c_int; |
54 | #[cfg_attr (PyPy, link_name = "PyPyDict_Update" )] |
55 | pub unsafefn PyDict_Update(mp: *mut PyObject, other: *mut PyObject) -> c_int; |
56 | #[cfg_attr (PyPy, link_name = "PyPyDict_Merge" )] |
57 | pub unsafefn PyDict_Merge(mp: *mut PyObject, other: *mut PyObject, _override: c_int) -> c_int; |
58 | pub unsafefn PyDict_MergeFromSeq2(d: *mut PyObject, seq2: *mut PyObject, _override: c_int) -> c_int; |
59 | #[cfg_attr (PyPy, link_name = "PyPyDict_GetItemString" )] |
60 | pub unsafefn PyDict_GetItemString(dp: *mut PyObject, key: *const c_char) -> *mut PyObject; |
61 | #[cfg_attr (PyPy, link_name = "PyPyDict_SetItemString" )] |
62 | pub unsafefn PyDict_SetItemString( |
63 | dp: *mut PyObject, |
64 | key: *const c_char, |
65 | item: *mut PyObject, |
66 | ) -> c_int; |
67 | #[cfg_attr (PyPy, link_name = "PyPyDict_DelItemString" )] |
68 | pub unsafefn PyDict_DelItemString(dp: *mut PyObject, key: *const c_char) -> c_int; |
69 | #[cfg (Py_3_13)] |
70 | #[cfg_attr (PyPy, link_name = "PyPyDict_GetItemRef" )] |
71 | pub fn PyDict_GetItemRef( |
72 | dp: *mut PyObject, |
73 | key: *mut PyObject, |
74 | result: *mut *mut PyObject, |
75 | ) -> c_int; |
76 | // skipped 3.10 / ex-non-limited PyObject_GenericGetDict |
77 | } |
78 | |
79 | #[cfg_attr (windows, link(name = "pythonXY" ))] |
80 | unsafeextern "C" { |
81 | pub unsafestatic mut PyDictKeys_Type: PyTypeObject; |
82 | pub unsafestatic mut PyDictValues_Type: PyTypeObject; |
83 | pub unsafestatic mut PyDictItems_Type: PyTypeObject; |
84 | } |
85 | |
86 | #[inline ] |
87 | pub unsafe fn PyDictKeys_Check(op: *mut PyObject) -> c_int { |
88 | (Py_TYPE(ob:op) == addr_of_mut!(PyDictKeys_Type)) as c_int |
89 | } |
90 | |
91 | #[inline ] |
92 | pub unsafe fn PyDictValues_Check(op: *mut PyObject) -> c_int { |
93 | (Py_TYPE(ob:op) == addr_of_mut!(PyDictValues_Type)) as c_int |
94 | } |
95 | |
96 | #[inline ] |
97 | pub unsafe fn PyDictItems_Check(op: *mut PyObject) -> c_int { |
98 | (Py_TYPE(ob:op) == addr_of_mut!(PyDictItems_Type)) as c_int |
99 | } |
100 | |
101 | #[inline ] |
102 | pub unsafe fn PyDictViewSet_Check(op: *mut PyObject) -> c_int { |
103 | (PyDictKeys_Check(op) != 0 || PyDictItems_Check(op) != 0) as c_int |
104 | } |
105 | |
106 | #[cfg_attr (windows, link(name = "pythonXY" ))] |
107 | unsafeextern "C" { |
108 | pub unsafestatic mut PyDictIterKey_Type: PyTypeObject; |
109 | pub unsafestatic mut PyDictIterValue_Type: PyTypeObject; |
110 | pub unsafestatic mut PyDictIterItem_Type: PyTypeObject; |
111 | #[cfg (Py_3_8)] |
112 | pub unsafestatic mut PyDictRevIterKey_Type: PyTypeObject; |
113 | #[cfg (Py_3_8)] |
114 | pub unsafestatic mut PyDictRevIterValue_Type: PyTypeObject; |
115 | #[cfg (Py_3_8)] |
116 | pub unsafestatic mut PyDictRevIterItem_Type: PyTypeObject; |
117 | } |
118 | |
119 | #[cfg (any(PyPy, GraalPy, Py_LIMITED_API))] |
120 | // TODO: remove (see https://github.com/PyO3/pyo3/pull/1341#issuecomment-751515985) |
121 | opaque_struct!(PyDictObject); |
122 | |