pyo3_ffi/
abstract_.rs

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