1 | use crate::object::*; |
2 | use crate::pyport::Py_ssize_t; |
3 | #[cfg (any(Py_3_12, all(Py_3_8, not(Py_LIMITED_API))))] |
4 | use libc::size_t; |
5 | use std::os::raw::{c_char, c_int}; |
6 | |
7 | #[inline ] |
8 | #[cfg (all( |
9 | not(Py_3_13), // CPython exposed as a function in 3.13, in object.h |
10 | not(all(PyPy, not(Py_3_11))) // PyPy exposed as a function until PyPy 3.10, macro in 3.11+ |
11 | ))] |
12 | pub unsafe fn PyObject_DelAttrString(o: *mut PyObject, attr_name: *const c_char) -> c_int { |
13 | PyObject_SetAttrString(arg1:o, arg2:attr_name, arg3:std::ptr::null_mut()) |
14 | } |
15 | |
16 | #[inline ] |
17 | #[cfg (all( |
18 | not(Py_3_13), // CPython exposed as a function in 3.13, in object.h |
19 | not(all(PyPy, not(Py_3_11))) // PyPy exposed as a function until PyPy 3.10, macro in 3.11+ |
20 | ))] |
21 | pub unsafe fn PyObject_DelAttr(o: *mut PyObject, attr_name: *mut PyObject) -> c_int { |
22 | PyObject_SetAttr(arg1:o, arg2:attr_name, arg3:std::ptr::null_mut()) |
23 | } |
24 | |
25 | unsafeextern "C" { |
26 | #[cfg (all( |
27 | not(PyPy), |
28 | any(Py_3_10, all(not(Py_LIMITED_API), Py_3_9)) // Added to python in 3.9 but to limited API in 3.10 |
29 | ))] |
30 | #[cfg_attr (PyPy, link_name = "PyPyObject_CallNoArgs" )] |
31 | pub unsafefn PyObject_CallNoArgs(func: *mut PyObject) -> *mut PyObject; |
32 | #[cfg_attr (PyPy, link_name = "PyPyObject_Call" )] |
33 | pub unsafefn PyObject_Call( |
34 | callable_object: *mut PyObject, |
35 | args: *mut PyObject, |
36 | kw: *mut PyObject, |
37 | ) -> *mut PyObject; |
38 | #[cfg_attr (PyPy, link_name = "PyPyObject_CallObject" )] |
39 | pub unsafefn PyObject_CallObject( |
40 | callable_object: *mut PyObject, |
41 | args: *mut PyObject, |
42 | ) -> *mut PyObject; |
43 | #[cfg_attr (PyPy, link_name = "PyPyObject_CallFunction" )] |
44 | pub unsafefn PyObject_CallFunction( |
45 | callable_object: *mut PyObject, |
46 | format: *const c_char, |
47 | ... |
48 | ) -> *mut PyObject; |
49 | #[cfg_attr (PyPy, link_name = "PyPyObject_CallMethod" )] |
50 | pub unsafefn PyObject_CallMethod( |
51 | o: *mut PyObject, |
52 | method: *const c_char, |
53 | format: *const c_char, |
54 | ... |
55 | ) -> *mut PyObject; |
56 | |
57 | #[cfg (not(Py_3_13))] |
58 | #[cfg_attr (PyPy, link_name = "_PyPyObject_CallFunction_SizeT" )] |
59 | pub unsafefn _PyObject_CallFunction_SizeT( |
60 | callable_object: *mut PyObject, |
61 | format: *const c_char, |
62 | ... |
63 | ) -> *mut PyObject; |
64 | #[cfg (not(Py_3_13))] |
65 | #[cfg_attr (PyPy, link_name = "_PyPyObject_CallMethod_SizeT" )] |
66 | pub unsafefn _PyObject_CallMethod_SizeT( |
67 | o: *mut PyObject, |
68 | method: *const c_char, |
69 | format: *const c_char, |
70 | ... |
71 | ) -> *mut PyObject; |
72 | |
73 | #[cfg_attr (PyPy, link_name = "PyPyObject_CallFunctionObjArgs" )] |
74 | pub unsafefn PyObject_CallFunctionObjArgs(callable: *mut PyObject, ...) -> *mut PyObject; |
75 | #[cfg_attr (PyPy, link_name = "PyPyObject_CallMethodObjArgs" )] |
76 | pub unsafefn PyObject_CallMethodObjArgs( |
77 | o: *mut PyObject, |
78 | method: *mut PyObject, |
79 | ... |
80 | ) -> *mut PyObject; |
81 | } |
82 | #[cfg (any(Py_3_12, all(Py_3_8, not(Py_LIMITED_API))))] |
83 | pub const PY_VECTORCALL_ARGUMENTS_OFFSET: size_t = |
84 | 1 << (8 * std::mem::size_of::<size_t>() as size_t - 1); |
85 | |
86 | unsafeextern "C" { |
87 | #[cfg_attr (PyPy, link_name = "PyPyObject_Vectorcall" )] |
88 | #[cfg (any(Py_3_12, all(Py_3_11, not(Py_LIMITED_API))))] |
89 | pub fn PyObject_Vectorcall( |
90 | callable: *mut PyObject, |
91 | args: *const *mut PyObject, |
92 | nargsf: size_t, |
93 | kwnames: *mut PyObject, |
94 | ) -> *mut PyObject; |
95 | |
96 | #[cfg (any(Py_3_12, all(Py_3_9, not(any(Py_LIMITED_API, PyPy, GraalPy)))))] |
97 | pub fn PyObject_VectorcallMethod( |
98 | name: *mut PyObject, |
99 | args: *const *mut PyObject, |
100 | nargsf: size_t, |
101 | kwnames: *mut PyObject, |
102 | ) -> *mut PyObject; |
103 | #[cfg_attr (PyPy, link_name = "PyPyObject_Type" )] |
104 | pub unsafefn PyObject_Type(o: *mut PyObject) -> *mut PyObject; |
105 | #[cfg_attr (PyPy, link_name = "PyPyObject_Size" )] |
106 | pub unsafefn PyObject_Size(o: *mut PyObject) -> Py_ssize_t; |
107 | } |
108 | |
109 | #[inline ] |
110 | pub unsafe fn PyObject_Length(o: *mut PyObject) -> Py_ssize_t { |
111 | PyObject_Size(o) |
112 | } |
113 | |
114 | unsafeextern "C" { |
115 | #[cfg_attr (PyPy, link_name = "PyPyObject_GetItem" )] |
116 | pub unsafefn PyObject_GetItem(o: *mut PyObject, key: *mut PyObject) -> *mut PyObject; |
117 | #[cfg_attr (PyPy, link_name = "PyPyObject_SetItem" )] |
118 | pub unsafefn PyObject_SetItem(o: *mut PyObject, key: *mut PyObject, v: *mut PyObject) -> c_int; |
119 | #[cfg_attr (PyPy, link_name = "PyPyObject_DelItemString" )] |
120 | pub unsafefn PyObject_DelItemString(o: *mut PyObject, key: *const c_char) -> c_int; |
121 | #[cfg_attr (PyPy, link_name = "PyPyObject_DelItem" )] |
122 | pub unsafefn PyObject_DelItem(o: *mut PyObject, key: *mut PyObject) -> c_int; |
123 | } |
124 | |
125 | unsafeextern "C" { |
126 | #[cfg_attr (PyPy, link_name = "PyPyObject_Format" )] |
127 | pub unsafefn PyObject_Format(obj: *mut PyObject, format_spec: *mut PyObject) -> *mut PyObject; |
128 | #[cfg_attr (PyPy, link_name = "PyPyObject_GetIter" )] |
129 | pub unsafefn PyObject_GetIter(arg1: *mut PyObject) -> *mut PyObject; |
130 | } |
131 | |
132 | // Before 3.8 PyIter_Check was defined in CPython as a macro, |
133 | // but the implementation of that in PyO3 did not work, see |
134 | // https://github.com/PyO3/pyo3/pull/2914 |
135 | // |
136 | // This is a slow implementation which should function equivalently. |
137 | #[cfg (not(any(Py_3_8, PyPy)))] |
138 | #[inline ] |
139 | pub unsafe fn PyIter_Check(o: *mut PyObject) -> c_int { |
140 | crate::PyObject_HasAttrString(crate::Py_TYPE(o).cast(), c_str!("__next__" ).as_ptr()) |
141 | } |
142 | |
143 | unsafeextern "C" { |
144 | #[cfg (any(Py_3_8, PyPy))] |
145 | #[cfg_attr (PyPy, link_name = "PyPyIter_Check" )] |
146 | pub unsafefn PyIter_Check(obj: *mut PyObject) -> c_int; |
147 | |
148 | #[cfg_attr (PyPy, link_name = "PyPyIter_Next" )] |
149 | pub unsafefn PyIter_Next(arg1: *mut PyObject) -> *mut PyObject; |
150 | #[cfg (all(not(PyPy), Py_3_10))] |
151 | #[cfg_attr (PyPy, link_name = "PyPyIter_Send" )] |
152 | pub unsafefn PyIter_Send( |
153 | iter: *mut PyObject, |
154 | arg: *mut PyObject, |
155 | presult: *mut *mut PyObject, |
156 | ) -> PySendResult; |
157 | |
158 | #[cfg_attr (PyPy, link_name = "PyPyNumber_Check" )] |
159 | pub unsafefn PyNumber_Check(o: *mut PyObject) -> c_int; |
160 | #[cfg_attr (PyPy, link_name = "PyPyNumber_Add" )] |
161 | pub unsafefn PyNumber_Add(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
162 | #[cfg_attr (PyPy, link_name = "PyPyNumber_Subtract" )] |
163 | pub unsafefn PyNumber_Subtract(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
164 | #[cfg_attr (PyPy, link_name = "PyPyNumber_Multiply" )] |
165 | pub unsafefn PyNumber_Multiply(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
166 | #[cfg_attr (PyPy, link_name = "PyPyNumber_MatrixMultiply" )] |
167 | pub unsafefn PyNumber_MatrixMultiply(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
168 | #[cfg_attr (PyPy, link_name = "PyPyNumber_FloorDivide" )] |
169 | pub unsafefn PyNumber_FloorDivide(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
170 | #[cfg_attr (PyPy, link_name = "PyPyNumber_TrueDivide" )] |
171 | pub unsafefn PyNumber_TrueDivide(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
172 | #[cfg_attr (PyPy, link_name = "PyPyNumber_Remainder" )] |
173 | pub unsafefn PyNumber_Remainder(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
174 | #[cfg_attr (PyPy, link_name = "PyPyNumber_Divmod" )] |
175 | pub unsafefn PyNumber_Divmod(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
176 | #[cfg_attr (PyPy, link_name = "PyPyNumber_Power" )] |
177 | pub unsafefn PyNumber_Power(o1: *mut PyObject, o2: *mut PyObject, o3: *mut PyObject) |
178 | -> *mut PyObject; |
179 | #[cfg_attr (PyPy, link_name = "PyPyNumber_Negative" )] |
180 | pub unsafefn PyNumber_Negative(o: *mut PyObject) -> *mut PyObject; |
181 | #[cfg_attr (PyPy, link_name = "PyPyNumber_Positive" )] |
182 | pub unsafefn PyNumber_Positive(o: *mut PyObject) -> *mut PyObject; |
183 | #[cfg_attr (PyPy, link_name = "PyPyNumber_Absolute" )] |
184 | pub unsafefn PyNumber_Absolute(o: *mut PyObject) -> *mut PyObject; |
185 | #[cfg_attr (PyPy, link_name = "PyPyNumber_Invert" )] |
186 | pub unsafefn PyNumber_Invert(o: *mut PyObject) -> *mut PyObject; |
187 | #[cfg_attr (PyPy, link_name = "PyPyNumber_Lshift" )] |
188 | pub unsafefn PyNumber_Lshift(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
189 | #[cfg_attr (PyPy, link_name = "PyPyNumber_Rshift" )] |
190 | pub unsafefn PyNumber_Rshift(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
191 | #[cfg_attr (PyPy, link_name = "PyPyNumber_And" )] |
192 | pub unsafefn PyNumber_And(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
193 | #[cfg_attr (PyPy, link_name = "PyPyNumber_Xor" )] |
194 | pub unsafefn PyNumber_Xor(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
195 | #[cfg_attr (PyPy, link_name = "PyPyNumber_Or" )] |
196 | pub unsafefn PyNumber_Or(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
197 | } |
198 | |
199 | // Defined as this macro in Python limited API, but relies on |
200 | // non-limited PyTypeObject. Don't expose this since it cannot be used. |
201 | #[cfg (not(any(Py_LIMITED_API, PyPy)))] |
202 | #[inline ] |
203 | pub unsafe fn PyIndex_Check(o: *mut PyObject) -> c_int { |
204 | let tp_as_number = (*Py_TYPE(o)).tp_as_number; |
205 | (!tp_as_number.is_null() && (*tp_as_number).nb_index.is_some()) as c_int |
206 | } |
207 | |
208 | unsafeextern "C" { |
209 | #[cfg (any(all(Py_3_8, Py_LIMITED_API), PyPy))] |
210 | #[link_name = "PyPyIndex_Check" ] |
211 | pub unsafefn PyIndex_Check(o: *mut PyObject) -> c_int; |
212 | |
213 | #[cfg_attr (PyPy, link_name = "PyPyNumber_Index" )] |
214 | pub unsafefn PyNumber_Index(o: *mut PyObject) -> *mut PyObject; |
215 | #[cfg_attr (PyPy, link_name = "PyPyNumber_AsSsize_t" )] |
216 | pub unsafefn PyNumber_AsSsize_t(o: *mut PyObject, exc: *mut PyObject) -> Py_ssize_t; |
217 | #[cfg_attr (PyPy, link_name = "PyPyNumber_Long" )] |
218 | pub unsafefn PyNumber_Long(o: *mut PyObject) -> *mut PyObject; |
219 | #[cfg_attr (PyPy, link_name = "PyPyNumber_Float" )] |
220 | pub unsafefn PyNumber_Float(o: *mut PyObject) -> *mut PyObject; |
221 | #[cfg_attr (PyPy, link_name = "PyPyNumber_InPlaceAdd" )] |
222 | pub unsafefn PyNumber_InPlaceAdd(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
223 | #[cfg_attr (PyPy, link_name = "PyPyNumber_InPlaceSubtract" )] |
224 | pub unsafefn PyNumber_InPlaceSubtract(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
225 | #[cfg_attr (PyPy, link_name = "PyPyNumber_InPlaceMultiply" )] |
226 | pub unsafefn PyNumber_InPlaceMultiply(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
227 | #[cfg_attr (PyPy, link_name = "PyPyNumber_InPlaceMatrixMultiply" )] |
228 | pub unsafefn PyNumber_InPlaceMatrixMultiply(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
229 | #[cfg_attr (PyPy, link_name = "PyPyNumber_InPlaceFloorDivide" )] |
230 | pub unsafefn PyNumber_InPlaceFloorDivide(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
231 | #[cfg_attr (PyPy, link_name = "PyPyNumber_InPlaceTrueDivide" )] |
232 | pub unsafefn PyNumber_InPlaceTrueDivide(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
233 | #[cfg_attr (PyPy, link_name = "PyPyNumber_InPlaceRemainder" )] |
234 | pub unsafefn PyNumber_InPlaceRemainder(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
235 | #[cfg_attr (PyPy, link_name = "PyPyNumber_InPlacePower" )] |
236 | pub unsafefn PyNumber_InPlacePower( |
237 | o1: *mut PyObject, |
238 | o2: *mut PyObject, |
239 | o3: *mut PyObject, |
240 | ) -> *mut PyObject; |
241 | #[cfg_attr (PyPy, link_name = "PyPyNumber_InPlaceLshift" )] |
242 | pub unsafefn PyNumber_InPlaceLshift(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
243 | #[cfg_attr (PyPy, link_name = "PyPyNumber_InPlaceRshift" )] |
244 | pub unsafefn PyNumber_InPlaceRshift(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
245 | #[cfg_attr (PyPy, link_name = "PyPyNumber_InPlaceAnd" )] |
246 | pub unsafefn PyNumber_InPlaceAnd(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
247 | #[cfg_attr (PyPy, link_name = "PyPyNumber_InPlaceXor" )] |
248 | pub unsafefn PyNumber_InPlaceXor(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
249 | #[cfg_attr (PyPy, link_name = "PyPyNumber_InPlaceOr" )] |
250 | pub unsafefn PyNumber_InPlaceOr(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
251 | pub unsafefn PyNumber_ToBase(n: *mut PyObject, base: c_int) -> *mut PyObject; |
252 | |
253 | #[cfg_attr (PyPy, link_name = "PyPySequence_Check" )] |
254 | pub unsafefn PySequence_Check(o: *mut PyObject) -> c_int; |
255 | #[cfg_attr (PyPy, link_name = "PyPySequence_Size" )] |
256 | pub unsafefn PySequence_Size(o: *mut PyObject) -> Py_ssize_t; |
257 | |
258 | #[cfg (PyPy)] |
259 | #[link_name = "PyPySequence_Length" ] |
260 | pub fn PySequence_Length(o: *mut PyObject) -> Py_ssize_t; |
261 | } |
262 | |
263 | #[inline ] |
264 | #[cfg (not(PyPy))] |
265 | pub unsafe fn PySequence_Length(o: *mut PyObject) -> Py_ssize_t { |
266 | PySequence_Size(o) |
267 | } |
268 | |
269 | unsafeextern "C" { |
270 | #[cfg_attr (PyPy, link_name = "PyPySequence_Concat" )] |
271 | pub unsafefn PySequence_Concat(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
272 | #[cfg_attr (PyPy, link_name = "PyPySequence_Repeat" )] |
273 | pub unsafefn PySequence_Repeat(o: *mut PyObject, count: Py_ssize_t) -> *mut PyObject; |
274 | #[cfg_attr (PyPy, link_name = "PyPySequence_GetItem" )] |
275 | pub unsafefn PySequence_GetItem(o: *mut PyObject, i: Py_ssize_t) -> *mut PyObject; |
276 | #[cfg_attr (PyPy, link_name = "PyPySequence_GetSlice" )] |
277 | pub unsafefn PySequence_GetSlice(o: *mut PyObject, i1: Py_ssize_t, i2: Py_ssize_t) -> *mut PyObject; |
278 | #[cfg_attr (PyPy, link_name = "PyPySequence_SetItem" )] |
279 | pub unsafefn PySequence_SetItem(o: *mut PyObject, i: Py_ssize_t, v: *mut PyObject) -> c_int; |
280 | #[cfg_attr (PyPy, link_name = "PyPySequence_DelItem" )] |
281 | pub unsafefn PySequence_DelItem(o: *mut PyObject, i: Py_ssize_t) -> c_int; |
282 | #[cfg_attr (PyPy, link_name = "PyPySequence_SetSlice" )] |
283 | pub unsafefn PySequence_SetSlice( |
284 | o: *mut PyObject, |
285 | i1: Py_ssize_t, |
286 | i2: Py_ssize_t, |
287 | v: *mut PyObject, |
288 | ) -> c_int; |
289 | #[cfg_attr (PyPy, link_name = "PyPySequence_DelSlice" )] |
290 | pub unsafefn PySequence_DelSlice(o: *mut PyObject, i1: Py_ssize_t, i2: Py_ssize_t) -> c_int; |
291 | #[cfg_attr (PyPy, link_name = "PyPySequence_Tuple" )] |
292 | pub unsafefn PySequence_Tuple(o: *mut PyObject) -> *mut PyObject; |
293 | #[cfg_attr (PyPy, link_name = "PyPySequence_List" )] |
294 | pub unsafefn PySequence_List(o: *mut PyObject) -> *mut PyObject; |
295 | #[cfg_attr (PyPy, link_name = "PyPySequence_Fast" )] |
296 | pub unsafefn PySequence_Fast(o: *mut PyObject, m: *const c_char) -> *mut PyObject; |
297 | // skipped PySequence_Fast_GET_SIZE |
298 | // skipped PySequence_Fast_GET_ITEM |
299 | // skipped PySequence_Fast_GET_ITEMS |
300 | pub unsafefn PySequence_Count(o: *mut PyObject, value: *mut PyObject) -> Py_ssize_t; |
301 | #[cfg_attr (PyPy, link_name = "PyPySequence_Contains" )] |
302 | pub unsafefn PySequence_Contains(seq: *mut PyObject, ob: *mut PyObject) -> c_int; |
303 | } |
304 | |
305 | #[inline ] |
306 | pub unsafe fn PySequence_In(o: *mut PyObject, value: *mut PyObject) -> c_int { |
307 | PySequence_Contains(seq:o, ob:value) |
308 | } |
309 | |
310 | unsafeextern "C" { |
311 | #[cfg_attr (PyPy, link_name = "PyPySequence_Index" )] |
312 | pub unsafefn PySequence_Index(o: *mut PyObject, value: *mut PyObject) -> Py_ssize_t; |
313 | #[cfg_attr (PyPy, link_name = "PyPySequence_InPlaceConcat" )] |
314 | pub unsafefn PySequence_InPlaceConcat(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
315 | #[cfg_attr (PyPy, link_name = "PyPySequence_InPlaceRepeat" )] |
316 | pub unsafefn PySequence_InPlaceRepeat(o: *mut PyObject, count: Py_ssize_t) -> *mut PyObject; |
317 | #[cfg_attr (PyPy, link_name = "PyPyMapping_Check" )] |
318 | pub unsafefn PyMapping_Check(o: *mut PyObject) -> c_int; |
319 | #[cfg_attr (PyPy, link_name = "PyPyMapping_Size" )] |
320 | pub unsafefn PyMapping_Size(o: *mut PyObject) -> Py_ssize_t; |
321 | |
322 | #[cfg (PyPy)] |
323 | #[link_name = "PyPyMapping_Length" ] |
324 | pub fn PyMapping_Length(o: *mut PyObject) -> Py_ssize_t; |
325 | } |
326 | |
327 | #[inline ] |
328 | #[cfg (not(PyPy))] |
329 | pub unsafe fn PyMapping_Length(o: *mut PyObject) -> Py_ssize_t { |
330 | PyMapping_Size(o) |
331 | } |
332 | |
333 | #[inline ] |
334 | pub unsafe fn PyMapping_DelItemString(o: *mut PyObject, key: *mut c_char) -> c_int { |
335 | PyObject_DelItemString(o, key) |
336 | } |
337 | |
338 | #[inline ] |
339 | pub unsafe fn PyMapping_DelItem(o: *mut PyObject, key: *mut PyObject) -> c_int { |
340 | PyObject_DelItem(o, key) |
341 | } |
342 | |
343 | unsafeextern "C" { |
344 | #[cfg_attr (PyPy, link_name = "PyPyMapping_HasKeyString" )] |
345 | pub unsafefn PyMapping_HasKeyString(o: *mut PyObject, key: *const c_char) -> c_int; |
346 | #[cfg_attr (PyPy, link_name = "PyPyMapping_HasKey" )] |
347 | pub unsafefn PyMapping_HasKey(o: *mut PyObject, key: *mut PyObject) -> c_int; |
348 | #[cfg_attr (PyPy, link_name = "PyPyMapping_Keys" )] |
349 | pub unsafefn PyMapping_Keys(o: *mut PyObject) -> *mut PyObject; |
350 | #[cfg_attr (PyPy, link_name = "PyPyMapping_Values" )] |
351 | pub unsafefn PyMapping_Values(o: *mut PyObject) -> *mut PyObject; |
352 | #[cfg_attr (PyPy, link_name = "PyPyMapping_Items" )] |
353 | pub unsafefn PyMapping_Items(o: *mut PyObject) -> *mut PyObject; |
354 | #[cfg_attr (PyPy, link_name = "PyPyMapping_GetItemString" )] |
355 | pub unsafefn PyMapping_GetItemString(o: *mut PyObject, key: *const c_char) -> *mut PyObject; |
356 | #[cfg_attr (PyPy, link_name = "PyPyMapping_SetItemString" )] |
357 | pub unsafefn PyMapping_SetItemString( |
358 | o: *mut PyObject, |
359 | key: *const c_char, |
360 | value: *mut PyObject, |
361 | ) -> c_int; |
362 | #[cfg_attr (PyPy, link_name = "PyPyObject_IsInstance" )] |
363 | pub unsafefn PyObject_IsInstance(object: *mut PyObject, typeorclass: *mut PyObject) -> c_int; |
364 | #[cfg_attr (PyPy, link_name = "PyPyObject_IsSubclass" )] |
365 | pub unsafefn PyObject_IsSubclass(object: *mut PyObject, typeorclass: *mut PyObject) -> c_int; |
366 | } |
367 | |