python27_sys/
objectabstract.rs

1use core::ptr;
2use libc::{c_char, c_int, c_void};
3
4use crate::object::*;
5use crate::pyport::Py_ssize_t;
6
7#[inline]
8pub unsafe fn PyObject_DelAttrString(o: *mut PyObject, attr_name: *const c_char) -> c_int {
9    PyObject_SetAttrString(o, attr_name, ptr::null_mut())
10}
11
12#[inline]
13pub unsafe fn PyObject_DelAttr(o: *mut PyObject, attr_name: *mut PyObject) -> c_int {
14    PyObject_SetAttr(o, attr_name, ptr::null_mut())
15}
16
17#[cfg_attr(windows, link(name = "pythonXY"))]
18extern "C" {
19    pub fn PyObject_Cmp(o1: *mut PyObject, o2: *mut PyObject, result: *mut c_int) -> c_int;
20    pub fn PyObject_Call(
21        callable_object: *mut PyObject,
22        args: *mut PyObject,
23        kw: *mut PyObject,
24    ) -> *mut PyObject;
25    pub fn PyObject_CallObject(
26        callable_object: *mut PyObject,
27        args: *mut PyObject,
28    ) -> *mut PyObject;
29    pub fn PyObject_CallFunction(
30        callable_object: *mut PyObject,
31        format: *mut c_char,
32        ...
33    ) -> *mut PyObject;
34    pub fn PyObject_CallMethod(
35        o: *mut PyObject,
36        m: *mut c_char,
37        format: *mut c_char,
38        ...
39    ) -> *mut PyObject;
40    fn _PyObject_CallFunction_SizeT(
41        callable: *mut PyObject,
42        format: *mut c_char,
43        ...
44    ) -> *mut PyObject;
45    fn _PyObject_CallMethod_SizeT(
46        o: *mut PyObject,
47        name: *mut c_char,
48        format: *mut c_char,
49        ...
50    ) -> *mut PyObject;
51    pub fn PyObject_CallFunctionObjArgs(callable: *mut PyObject, ...) -> *mut PyObject;
52    pub fn PyObject_CallMethodObjArgs(o: *mut PyObject, m: *mut PyObject, ...) -> *mut PyObject;
53    pub fn PyObject_Type(o: *mut PyObject) -> *mut PyObject;
54    pub fn PyObject_Size(o: *mut PyObject) -> Py_ssize_t;
55    pub fn _PyObject_LengthHint(o: *mut PyObject, arg1: Py_ssize_t) -> Py_ssize_t;
56    pub fn PyObject_GetItem(o: *mut PyObject, key: *mut PyObject) -> *mut PyObject;
57    pub fn PyObject_SetItem(o: *mut PyObject, key: *mut PyObject, v: *mut PyObject) -> c_int;
58    pub fn PyObject_DelItemString(o: *mut PyObject, key: *mut c_char) -> c_int;
59    pub fn PyObject_DelItem(o: *mut PyObject, key: *mut PyObject) -> c_int;
60    pub fn PyObject_AsCharBuffer(
61        obj: *mut PyObject,
62        buffer: *mut *const c_char,
63        buffer_len: *mut Py_ssize_t,
64    ) -> c_int;
65    pub fn PyObject_CheckReadBuffer(obj: *mut PyObject) -> c_int;
66    pub fn PyObject_AsReadBuffer(
67        obj: *mut PyObject,
68        buffer: *mut *const c_void,
69        buffer_len: *mut Py_ssize_t,
70    ) -> c_int;
71    pub fn PyObject_AsWriteBuffer(
72        obj: *mut PyObject,
73        buffer: *mut *mut c_void,
74        buffer_len: *mut Py_ssize_t,
75    ) -> c_int;
76
77    pub fn PyObject_GetBuffer(obj: *mut PyObject, view: *mut Py_buffer, flags: c_int) -> c_int;
78
79    pub fn PyBuffer_GetPointer(view: *mut Py_buffer, indices: *mut Py_ssize_t) -> *mut c_void;
80    pub fn PyBuffer_ToContiguous(
81        buf: *mut c_void,
82        view: *mut Py_buffer,
83        len: Py_ssize_t,
84        fort: c_char,
85    ) -> c_int;
86    pub fn PyBuffer_FromContiguous(
87        view: *mut Py_buffer,
88        buf: *mut c_void,
89        len: Py_ssize_t,
90        fort: c_char,
91    ) -> c_int;
92    pub fn PyObject_CopyData(dest: *mut PyObject, src: *mut PyObject) -> c_int;
93    pub fn PyBuffer_IsContiguous(view: *mut Py_buffer, fort: c_char) -> c_int;
94    pub fn PyBuffer_FillContiguousStrides(
95        ndims: c_int,
96        shape: *mut Py_ssize_t,
97        strides: *mut Py_ssize_t,
98        itemsize: c_int,
99        fort: c_char,
100    );
101    pub fn PyBuffer_FillInfo(
102        view: *mut Py_buffer,
103        o: *mut PyObject,
104        buf: *mut c_void,
105        len: Py_ssize_t,
106        readonly: c_int,
107        flags: c_int,
108    ) -> c_int;
109    pub fn PyBuffer_Release(view: *mut Py_buffer);
110    pub fn PyObject_Format(obj: *mut PyObject, format_spec: *mut PyObject) -> *mut PyObject;
111    pub fn PyObject_GetIter(arg1: *mut PyObject) -> *mut PyObject;
112    pub fn PyIter_Next(arg1: *mut PyObject) -> *mut PyObject;
113    fn _PyObject_NextNotImplemented(arg1: *mut PyObject) -> *mut PyObject;
114
115    pub fn PyNumber_Check(o: *mut PyObject) -> c_int;
116    pub fn PyNumber_Add(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject;
117    pub fn PyNumber_Subtract(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject;
118    pub fn PyNumber_Multiply(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject;
119    pub fn PyNumber_Divide(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject;
120    pub fn PyNumber_FloorDivide(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject;
121    pub fn PyNumber_TrueDivide(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject;
122    pub fn PyNumber_Remainder(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject;
123    pub fn PyNumber_Divmod(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject;
124    pub fn PyNumber_Power(o1: *mut PyObject, o2: *mut PyObject, o3: *mut PyObject)
125        -> *mut PyObject;
126    pub fn PyNumber_Negative(o: *mut PyObject) -> *mut PyObject;
127    pub fn PyNumber_Positive(o: *mut PyObject) -> *mut PyObject;
128    pub fn PyNumber_Absolute(o: *mut PyObject) -> *mut PyObject;
129    pub fn PyNumber_Invert(o: *mut PyObject) -> *mut PyObject;
130    pub fn PyNumber_Lshift(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject;
131    pub fn PyNumber_Rshift(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject;
132    pub fn PyNumber_And(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject;
133    pub fn PyNumber_Xor(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject;
134    pub fn PyNumber_Or(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject;
135    pub fn PyNumber_Index(o: *mut PyObject) -> *mut PyObject;
136    pub fn PyNumber_AsSsize_t(o: *mut PyObject, exc: *mut PyObject) -> Py_ssize_t;
137    fn _PyNumber_ConvertIntegralToInt(
138        integral: *mut PyObject,
139        error_format: *const c_char,
140    ) -> *mut PyObject;
141    pub fn PyNumber_Int(o: *mut PyObject) -> *mut PyObject;
142    pub fn PyNumber_Long(o: *mut PyObject) -> *mut PyObject;
143    pub fn PyNumber_Float(o: *mut PyObject) -> *mut PyObject;
144    pub fn PyNumber_InPlaceAdd(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject;
145    pub fn PyNumber_InPlaceSubtract(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject;
146    pub fn PyNumber_InPlaceMultiply(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject;
147    pub fn PyNumber_InPlaceDivide(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject;
148    pub fn PyNumber_InPlaceFloorDivide(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject;
149    pub fn PyNumber_InPlaceTrueDivide(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject;
150    pub fn PyNumber_InPlaceRemainder(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject;
151    pub fn PyNumber_InPlacePower(
152        o1: *mut PyObject,
153        o2: *mut PyObject,
154        o3: *mut PyObject,
155    ) -> *mut PyObject;
156    pub fn PyNumber_InPlaceLshift(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject;
157    pub fn PyNumber_InPlaceRshift(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject;
158    pub fn PyNumber_InPlaceAnd(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject;
159    pub fn PyNumber_InPlaceXor(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject;
160    pub fn PyNumber_InPlaceOr(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject;
161    pub fn PyNumber_ToBase(n: *mut PyObject, base: c_int) -> *mut PyObject;
162    pub fn PySequence_Check(o: *mut PyObject) -> c_int;
163    pub fn PySequence_Size(o: *mut PyObject) -> Py_ssize_t;
164    pub fn PySequence_Length(o: *mut PyObject) -> Py_ssize_t;
165    pub fn PySequence_Concat(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject;
166    pub fn PySequence_Repeat(o: *mut PyObject, count: Py_ssize_t) -> *mut PyObject;
167    pub fn PySequence_GetItem(o: *mut PyObject, i: Py_ssize_t) -> *mut PyObject;
168    pub fn PySequence_GetSlice(o: *mut PyObject, i1: Py_ssize_t, i2: Py_ssize_t) -> *mut PyObject;
169    pub fn PySequence_SetItem(o: *mut PyObject, i: Py_ssize_t, v: *mut PyObject) -> c_int;
170    pub fn PySequence_DelItem(o: *mut PyObject, i: Py_ssize_t) -> c_int;
171    pub fn PySequence_SetSlice(
172        o: *mut PyObject,
173        i1: Py_ssize_t,
174        i2: Py_ssize_t,
175        v: *mut PyObject,
176    ) -> c_int;
177    pub fn PySequence_DelSlice(o: *mut PyObject, i1: Py_ssize_t, i2: Py_ssize_t) -> c_int;
178    pub fn PySequence_Tuple(o: *mut PyObject) -> *mut PyObject;
179    pub fn PySequence_List(o: *mut PyObject) -> *mut PyObject;
180    pub fn PySequence_Fast(o: *mut PyObject, m: *const c_char) -> *mut PyObject;
181    pub fn PySequence_Count(o: *mut PyObject, value: *mut PyObject) -> Py_ssize_t;
182    pub fn PySequence_Contains(seq: *mut PyObject, ob: *mut PyObject) -> c_int;
183    pub fn _PySequence_IterSearch(
184        seq: *mut PyObject,
185        obj: *mut PyObject,
186        operation: c_int,
187    ) -> Py_ssize_t;
188    pub fn PySequence_In(o: *mut PyObject, value: *mut PyObject) -> c_int;
189    pub fn PySequence_Index(o: *mut PyObject, value: *mut PyObject) -> Py_ssize_t;
190    pub fn PySequence_InPlaceConcat(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject;
191    pub fn PySequence_InPlaceRepeat(o: *mut PyObject, count: Py_ssize_t) -> *mut PyObject;
192    pub fn PyMapping_Check(o: *mut PyObject) -> c_int;
193    pub fn PyMapping_Size(o: *mut PyObject) -> Py_ssize_t;
194    pub fn PyMapping_Length(o: *mut PyObject) -> Py_ssize_t;
195    pub fn PyMapping_HasKeyString(o: *mut PyObject, key: *mut c_char) -> c_int;
196    pub fn PyMapping_HasKey(o: *mut PyObject, key: *mut PyObject) -> c_int;
197    pub fn PyMapping_GetItemString(o: *mut PyObject, key: *mut c_char) -> *mut PyObject;
198    pub fn PyMapping_SetItemString(
199        o: *mut PyObject,
200        key: *mut c_char,
201        value: *mut PyObject,
202    ) -> c_int;
203    pub fn PyObject_IsInstance(object: *mut PyObject, typeorclass: *mut PyObject) -> c_int;
204    pub fn PyObject_IsSubclass(object: *mut PyObject, typeorclass: *mut PyObject) -> c_int;
205}
206
207#[inline]
208pub unsafe fn PyObject_CheckBuffer(obj: *mut PyObject) -> c_int {
209    let t = (*obj).ob_type;
210    let b = (*t).tp_as_buffer;
211    (!b.is_null()
212        && (PyType_HasFeature(t, Py_TPFLAGS_HAVE_NEWBUFFER) != 0)
213        && ((*b).bf_getbuffer.is_some())) as c_int
214}
215
216#[inline]
217pub unsafe fn PyIter_Check(obj: *mut PyObject) -> c_int {
218    let t = (*obj).ob_type;
219    (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER) != 0
220        && match (*t).tp_iternext {
221            None => false,
222            Some(f) => f as *const c_void != _PyObject_NextNotImplemented as *const c_void,
223        }) as c_int
224}
225
226#[inline]
227pub unsafe fn PyIndex_Check(obj: *mut PyObject) -> c_int {
228    let t = (*obj).ob_type;
229    let n = (*t).tp_as_number;
230    (!n.is_null() && PyType_HasFeature(t, Py_TPFLAGS_HAVE_INDEX) != 0 && (*n).nb_index.is_some())
231        as c_int
232}
233
234#[inline]
235pub unsafe fn PySequence_Fast_GET_SIZE(o: *mut PyObject) -> Py_ssize_t {
236    if crate::listobject::PyList_Check(o) != 0 {
237        crate::listobject::PyList_GET_SIZE(o)
238    } else {
239        crate::tupleobject::PyTuple_GET_SIZE(o)
240    }
241}
242
243#[inline]
244pub unsafe fn PySequence_Fast_GET_ITEM(o: *mut PyObject, i: Py_ssize_t) -> *mut PyObject {
245    if crate::listobject::PyList_Check(o) != 0 {
246        crate::listobject::PyList_GET_ITEM(o, i)
247    } else {
248        crate::tupleobject::PyTuple_GET_ITEM(o, i)
249    }
250}
251
252#[inline]
253pub unsafe fn PySequence_Fast_ITEMS(o: *mut PyObject) -> *mut *mut PyObject {
254    if crate::listobject::PyList_Check(o) != 0 {
255        (*(o as *mut crate::listobject::PyListObject)).ob_item
256    } else {
257        (*(o as *mut crate::tupleobject::PyTupleObject))
258            .ob_item
259            .as_mut_ptr()
260    }
261}
262
263#[inline]
264pub unsafe fn PySequence_ITEM(o: *mut PyObject, i: Py_ssize_t) -> *mut PyObject {
265    (*(*Py_TYPE(o)).tp_as_sequence).sq_item.unwrap()(o, i)
266}
267
268pub const PY_ITERSEARCH_COUNT: c_int = 1;
269pub const PY_ITERSEARCH_INDEX: c_int = 2;
270pub const PY_ITERSEARCH_CONTAINS: c_int = 3;
271
272#[inline]
273pub unsafe fn PyMapping_DelItemString(o: *mut PyObject, key: *mut c_char) -> c_int {
274    PyObject_DelItemString(o, key)
275}
276
277#[inline]
278pub unsafe fn PyMapping_DelItem(o: *mut PyObject, key: *mut PyObject) -> c_int {
279    PyObject_DelItem(o, key)
280}
281
282#[inline]
283pub unsafe fn PyMapping_Keys(o: *mut PyObject) -> *mut PyObject {
284    PyObject_CallMethod(o, "keys\0".as_ptr() as *mut _, ptr::null_mut())
285}
286
287#[inline]
288pub unsafe fn PyMapping_Values(o: *mut PyObject) -> *mut PyObject {
289    PyObject_CallMethod(o, "values\0".as_ptr() as *mut _, ptr::null_mut())
290}
291
292#[inline]
293pub unsafe fn PyMapping_Items(o: *mut PyObject) -> *mut PyObject {
294    PyObject_CallMethod(o, "items\0".as_ptr() as *mut _, ptr::null_mut())
295}