python27_sys/
object.rs

1use core::ptr;
2use libc::{c_char, c_double, c_int, c_long, c_uint, c_void, FILE};
3
4use crate::methodobject::PyMethodDef;
5use crate::pyport::Py_ssize_t;
6
7#[repr(C)]
8#[derive(Copy, Clone)]
9pub struct PyObject {
10    #[cfg(py_sys_config = "Py_TRACE_REFS")]
11    pub _ob_next: *mut PyObject,
12    #[cfg(py_sys_config = "Py_TRACE_REFS")]
13    pub _ob_prev: *mut PyObject,
14    pub ob_refcnt: Py_ssize_t,
15    pub ob_type: *mut PyTypeObject,
16}
17
18#[repr(C)]
19#[derive(Copy, Clone)]
20pub struct PyVarObject {
21    #[cfg(py_sys_config = "Py_TRACE_REFS")]
22    pub _ob_next: *mut PyObject,
23    #[cfg(py_sys_config = "Py_TRACE_REFS")]
24    pub _ob_prev: *mut PyObject,
25    pub ob_refcnt: Py_ssize_t,
26    pub ob_type: *mut PyTypeObject,
27    pub ob_size: Py_ssize_t,
28}
29
30#[inline(always)]
31pub unsafe fn Py_REFCNT(ob: *mut PyObject) -> Py_ssize_t {
32    (*ob).ob_refcnt
33}
34
35#[inline(always)]
36pub unsafe fn Py_TYPE(ob: *mut PyObject) -> *mut PyTypeObject {
37    (*ob).ob_type
38}
39
40#[inline(always)]
41pub unsafe fn Py_SIZE(ob: *mut PyObject) -> Py_ssize_t {
42    (*(ob as *mut PyVarObject)).ob_size
43}
44
45pub type unaryfunc = unsafe extern "C" fn(arg1: *mut PyObject) -> *mut PyObject;
46pub type binaryfunc =
47    unsafe extern "C" fn(arg1: *mut PyObject, arg2: *mut PyObject) -> *mut PyObject;
48pub type ternaryfunc = unsafe extern "C" fn(
49    arg1: *mut PyObject,
50    arg2: *mut PyObject,
51    arg3: *mut PyObject,
52) -> *mut PyObject;
53pub type inquiry = unsafe extern "C" fn(arg1: *mut PyObject) -> c_int;
54pub type lenfunc = unsafe extern "C" fn(arg1: *mut PyObject) -> Py_ssize_t;
55pub type coercion =
56    unsafe extern "C" fn(arg1: *mut *mut PyObject, arg2: *mut *mut PyObject) -> c_int;
57pub type ssizeargfunc =
58    unsafe extern "C" fn(arg1: *mut PyObject, arg2: Py_ssize_t) -> *mut PyObject;
59pub type ssizessizeargfunc =
60    unsafe extern "C" fn(arg1: *mut PyObject, arg2: Py_ssize_t, arg3: Py_ssize_t) -> *mut PyObject;
61pub type intobjargproc =
62    unsafe extern "C" fn(arg1: *mut PyObject, arg2: c_int, arg3: *mut PyObject) -> c_int;
63pub type intintobjargproc = unsafe extern "C" fn(
64    arg1: *mut PyObject,
65    arg2: c_int,
66    arg3: c_int,
67    arg4: *mut PyObject,
68) -> c_int;
69pub type ssizeobjargproc =
70    unsafe extern "C" fn(arg1: *mut PyObject, arg2: Py_ssize_t, arg3: *mut PyObject) -> c_int;
71pub type ssizessizeobjargproc = unsafe extern "C" fn(
72    arg1: *mut PyObject,
73    arg2: Py_ssize_t,
74    arg3: Py_ssize_t,
75    arg4: *mut PyObject,
76) -> c_int;
77pub type objobjargproc =
78    unsafe extern "C" fn(arg1: *mut PyObject, arg2: *mut PyObject, arg3: *mut PyObject) -> c_int;
79pub type getreadbufferproc =
80    unsafe extern "C" fn(arg1: *mut PyObject, arg2: c_int, arg3: *mut *mut c_void) -> c_int;
81pub type getwritebufferproc =
82    unsafe extern "C" fn(arg1: *mut PyObject, arg2: c_int, arg3: *mut *mut c_void) -> c_int;
83pub type getsegcountproc = unsafe extern "C" fn(arg1: *mut PyObject, arg2: *mut c_int) -> c_int;
84pub type getcharbufferproc =
85    unsafe extern "C" fn(arg1: *mut PyObject, arg2: c_int, arg3: *mut *mut c_char) -> c_int;
86pub type readbufferproc = unsafe extern "C" fn(
87    arg1: *mut PyObject,
88    arg2: Py_ssize_t,
89    arg3: *mut *mut c_void,
90) -> Py_ssize_t;
91pub type writebufferproc = unsafe extern "C" fn(
92    arg1: *mut PyObject,
93    arg2: Py_ssize_t,
94    arg3: *mut *mut c_void,
95) -> Py_ssize_t;
96pub type segcountproc =
97    unsafe extern "C" fn(arg1: *mut PyObject, arg2: *mut Py_ssize_t) -> Py_ssize_t;
98pub type charbufferproc = unsafe extern "C" fn(
99    arg1: *mut PyObject,
100    arg2: Py_ssize_t,
101    arg3: *mut *mut c_char,
102) -> Py_ssize_t;
103#[repr(C)]
104#[derive(Copy, Clone)]
105pub struct Py_buffer {
106    pub buf: *mut c_void,
107    pub obj: *mut PyObject,
108    pub len: Py_ssize_t,
109    pub itemsize: Py_ssize_t,
110    pub readonly: c_int,
111    pub ndim: c_int,
112    pub format: *mut c_char,
113    pub shape: *mut Py_ssize_t,
114    pub strides: *mut Py_ssize_t,
115    pub suboffsets: *mut Py_ssize_t,
116    pub smalltable: [Py_ssize_t; 2],
117    pub internal: *mut c_void,
118}
119
120pub type getbufferproc =
121    unsafe extern "C" fn(arg1: *mut PyObject, arg2: *mut Py_buffer, arg3: c_int) -> c_int;
122pub type releasebufferproc = unsafe extern "C" fn(arg1: *mut PyObject, arg2: *mut Py_buffer);
123
124// flags:
125pub const PyBUF_SIMPLE: c_int = 0;
126pub const PyBUF_WRITABLE: c_int = 0x0001;
127pub const PyBUF_FORMAT: c_int = 0x0004;
128pub const PyBUF_ND: c_int = 0x0008;
129pub const PyBUF_STRIDES: c_int = (0x0010 | PyBUF_ND);
130pub const PyBUF_C_CONTIGUOUS: c_int = (0x0020 | PyBUF_STRIDES);
131pub const PyBUF_F_CONTIGUOUS: c_int = (0x0040 | PyBUF_STRIDES);
132pub const PyBUF_ANY_CONTIGUOUS: c_int = (0x0080 | PyBUF_STRIDES);
133pub const PyBUF_INDIRECT: c_int = (0x0100 | PyBUF_STRIDES);
134
135pub const PyBUF_CONTIG: c_int = (PyBUF_ND | PyBUF_WRITABLE);
136pub const PyBUF_CONTIG_RO: c_int = (PyBUF_ND);
137
138pub const PyBUF_STRIDED: c_int = (PyBUF_STRIDES | PyBUF_WRITABLE);
139pub const PyBUF_STRIDED_RO: c_int = (PyBUF_STRIDES);
140
141pub const PyBUF_RECORDS: c_int = (PyBUF_STRIDES | PyBUF_WRITABLE | PyBUF_FORMAT);
142pub const PyBUF_RECORDS_RO: c_int = (PyBUF_STRIDES | PyBUF_FORMAT);
143
144pub const PyBUF_FULL: c_int = (PyBUF_INDIRECT | PyBUF_WRITABLE | PyBUF_FORMAT);
145pub const PyBUF_FULL_RO: c_int = (PyBUF_INDIRECT | PyBUF_FORMAT);
146
147// buffertype:
148pub const PyBUF_READ: c_int = 0x100;
149pub const PyBUF_WRITE: c_int = 0x200;
150pub const PyBUF_SHADOW: c_int = 0x400;
151
152pub type objobjproc = unsafe extern "C" fn(arg1: *mut PyObject, arg2: *mut PyObject) -> c_int;
153pub type visitproc = unsafe extern "C" fn(object: *mut PyObject, arg: *mut c_void) -> c_int;
154pub type traverseproc =
155    unsafe extern "C" fn(slf: *mut PyObject, visit: visitproc, arg: *mut c_void) -> c_int;
156
157#[repr(C)]
158#[derive(Copy)]
159pub struct PyNumberMethods {
160    pub nb_add: Option<binaryfunc>,
161    pub nb_subtract: Option<binaryfunc>,
162    pub nb_multiply: Option<binaryfunc>,
163    pub nb_divide: Option<binaryfunc>,
164    pub nb_remainder: Option<binaryfunc>,
165    pub nb_divmod: Option<binaryfunc>,
166    pub nb_power: Option<ternaryfunc>,
167    pub nb_negative: Option<unaryfunc>,
168    pub nb_positive: Option<unaryfunc>,
169    pub nb_absolute: Option<unaryfunc>,
170    pub nb_nonzero: Option<inquiry>,
171    pub nb_invert: Option<unaryfunc>,
172    pub nb_lshift: Option<binaryfunc>,
173    pub nb_rshift: Option<binaryfunc>,
174    pub nb_and: Option<binaryfunc>,
175    pub nb_xor: Option<binaryfunc>,
176    pub nb_or: Option<binaryfunc>,
177    pub nb_coerce: Option<coercion>,
178    pub nb_c_int: Option<unaryfunc>,
179    pub nb_long: Option<unaryfunc>,
180    pub nb_float: Option<unaryfunc>,
181    pub nb_oct: Option<unaryfunc>,
182    pub nb_hex: Option<unaryfunc>,
183    pub nb_inplace_add: Option<binaryfunc>,
184    pub nb_inplace_subtract: Option<binaryfunc>,
185    pub nb_inplace_multiply: Option<binaryfunc>,
186    pub nb_inplace_divide: Option<binaryfunc>,
187    pub nb_inplace_remainder: Option<binaryfunc>,
188    pub nb_inplace_power: Option<ternaryfunc>,
189    pub nb_inplace_lshift: Option<binaryfunc>,
190    pub nb_inplace_rshift: Option<binaryfunc>,
191    pub nb_inplace_and: Option<binaryfunc>,
192    pub nb_inplace_xor: Option<binaryfunc>,
193    pub nb_inplace_or: Option<binaryfunc>,
194    pub nb_floor_divide: Option<binaryfunc>,
195    pub nb_true_divide: Option<binaryfunc>,
196    pub nb_inplace_floor_divide: Option<binaryfunc>,
197    pub nb_inplace_true_divide: Option<binaryfunc>,
198    pub nb_index: Option<unaryfunc>,
199}
200
201impl Clone for PyNumberMethods {
202    #[inline]
203    fn clone(&self) -> PyNumberMethods {
204        *self
205    }
206}
207
208pub const PyNumberMethods_INIT: PyNumberMethods = PyNumberMethods {
209    nb_add: None,
210    nb_subtract: None,
211    nb_multiply: None,
212    nb_divide: None,
213    nb_remainder: None,
214    nb_divmod: None,
215    nb_power: None,
216    nb_negative: None,
217    nb_positive: None,
218    nb_absolute: None,
219    nb_nonzero: None,
220    nb_invert: None,
221    nb_lshift: None,
222    nb_rshift: None,
223    nb_and: None,
224    nb_xor: None,
225    nb_or: None,
226    nb_coerce: None,
227    nb_c_int: None,
228    nb_long: None,
229    nb_float: None,
230    nb_oct: None,
231    nb_hex: None,
232    nb_inplace_add: None,
233    nb_inplace_subtract: None,
234    nb_inplace_multiply: None,
235    nb_inplace_divide: None,
236    nb_inplace_remainder: None,
237    nb_inplace_power: None,
238    nb_inplace_lshift: None,
239    nb_inplace_rshift: None,
240    nb_inplace_and: None,
241    nb_inplace_xor: None,
242    nb_inplace_or: None,
243    nb_floor_divide: None,
244    nb_true_divide: None,
245    nb_inplace_floor_divide: None,
246    nb_inplace_true_divide: None,
247    nb_index: None,
248};
249
250#[repr(C)]
251#[derive(Copy)]
252pub struct PySequenceMethods {
253    pub sq_length: Option<lenfunc>,
254    pub sq_concat: Option<binaryfunc>,
255    pub sq_repeat: Option<ssizeargfunc>,
256    pub sq_item: Option<ssizeargfunc>,
257    pub sq_slice: Option<ssizessizeargfunc>,
258    pub sq_ass_item: Option<ssizeobjargproc>,
259    pub sq_ass_slice: Option<ssizessizeobjargproc>,
260    pub sq_contains: Option<objobjproc>,
261    pub sq_inplace_concat: Option<binaryfunc>,
262    pub sq_inplace_repeat: Option<ssizeargfunc>,
263}
264
265impl Clone for PySequenceMethods {
266    #[inline]
267    fn clone(&self) -> PySequenceMethods {
268        *self
269    }
270}
271
272pub const PySequenceMethods_INIT: PySequenceMethods = PySequenceMethods {
273    sq_length: None,
274    sq_concat: None,
275    sq_repeat: None,
276    sq_item: None,
277    sq_slice: None,
278    sq_ass_item: None,
279    sq_ass_slice: None,
280    sq_contains: None,
281    sq_inplace_concat: None,
282    sq_inplace_repeat: None,
283};
284
285#[repr(C)]
286#[derive(Copy)]
287pub struct PyMappingMethods {
288    pub mp_length: Option<lenfunc>,
289    pub mp_subscript: Option<binaryfunc>,
290    pub mp_ass_subscript: Option<objobjargproc>,
291}
292
293impl Clone for PyMappingMethods {
294    #[inline]
295    fn clone(&self) -> PyMappingMethods {
296        *self
297    }
298}
299
300pub const PyMappingMethods_INIT: PyMappingMethods = PyMappingMethods {
301    mp_length: None,
302    mp_subscript: None,
303    mp_ass_subscript: None,
304};
305
306#[repr(C)]
307#[derive(Copy)]
308pub struct PyBufferProcs {
309    pub bf_getreadbuffer: Option<readbufferproc>,
310    pub bf_getwritebuffer: Option<writebufferproc>,
311    pub bf_getsegcount: Option<segcountproc>,
312    pub bf_getcharbuffer: Option<charbufferproc>,
313    pub bf_getbuffer: Option<getbufferproc>,
314    pub bf_releasebuffer: Option<releasebufferproc>,
315}
316
317impl Clone for PyBufferProcs {
318    #[inline]
319    fn clone(&self) -> PyBufferProcs {
320        *self
321    }
322}
323
324pub const PyBufferProcs_INIT: PyBufferProcs = PyBufferProcs {
325    bf_getreadbuffer: None,
326    bf_getwritebuffer: None,
327    bf_getsegcount: None,
328    bf_getcharbuffer: None,
329    bf_getbuffer: None,
330    bf_releasebuffer: None,
331};
332
333pub type freefunc = unsafe extern "C" fn(arg1: *mut c_void);
334pub type destructor = unsafe extern "C" fn(arg1: *mut PyObject);
335pub type printfunc =
336    unsafe extern "C" fn(arg1: *mut PyObject, arg2: *mut FILE, arg3: c_int) -> c_int;
337pub type getattrfunc =
338    unsafe extern "C" fn(arg1: *mut PyObject, arg2: *mut c_char) -> *mut PyObject;
339pub type getattrofunc =
340    unsafe extern "C" fn(arg1: *mut PyObject, arg2: *mut PyObject) -> *mut PyObject;
341pub type setattrfunc =
342    unsafe extern "C" fn(arg1: *mut PyObject, arg2: *mut c_char, arg3: *mut PyObject) -> c_int;
343pub type setattrofunc =
344    unsafe extern "C" fn(arg1: *mut PyObject, arg2: *mut PyObject, arg3: *mut PyObject) -> c_int;
345pub type cmpfunc = unsafe extern "C" fn(arg1: *mut PyObject, arg2: *mut PyObject) -> c_int;
346pub type reprfunc = unsafe extern "C" fn(arg1: *mut PyObject) -> *mut PyObject;
347pub type hashfunc = unsafe extern "C" fn(arg1: *mut PyObject) -> c_long;
348pub type richcmpfunc =
349    unsafe extern "C" fn(arg1: *mut PyObject, arg2: *mut PyObject, arg3: c_int) -> *mut PyObject;
350pub type getiterfunc = unsafe extern "C" fn(arg1: *mut PyObject) -> *mut PyObject;
351pub type iternextfunc = unsafe extern "C" fn(arg1: *mut PyObject) -> *mut PyObject;
352pub type descrgetfunc = unsafe extern "C" fn(
353    arg1: *mut PyObject,
354    arg2: *mut PyObject,
355    arg3: *mut PyObject,
356) -> *mut PyObject;
357pub type descrsetfunc =
358    unsafe extern "C" fn(arg1: *mut PyObject, arg2: *mut PyObject, arg3: *mut PyObject) -> c_int;
359pub type initproc =
360    unsafe extern "C" fn(arg1: *mut PyObject, arg2: *mut PyObject, arg3: *mut PyObject) -> c_int;
361pub type newfunc = unsafe extern "C" fn(
362    arg1: *mut PyTypeObject,
363    arg2: *mut PyObject,
364    arg3: *mut PyObject,
365) -> *mut PyObject;
366pub type allocfunc =
367    unsafe extern "C" fn(arg1: *mut PyTypeObject, arg2: Py_ssize_t) -> *mut PyObject;
368
369#[repr(C)]
370#[derive(Copy)]
371pub struct PyTypeObject {
372    #[cfg(py_sys_config = "Py_TRACE_REFS")]
373    pub _ob_next: *mut PyObject,
374    #[cfg(py_sys_config = "Py_TRACE_REFS")]
375    pub _ob_prev: *mut PyObject,
376    pub ob_refcnt: Py_ssize_t,
377    pub ob_type: *mut PyTypeObject,
378    pub ob_size: Py_ssize_t,
379    pub tp_name: *const c_char,
380    pub tp_basicsize: Py_ssize_t,
381    pub tp_itemsize: Py_ssize_t,
382    pub tp_dealloc: Option<destructor>,
383    pub tp_print: Option<printfunc>,
384    pub tp_getattr: Option<getattrfunc>,
385    pub tp_setattr: Option<setattrfunc>,
386    pub tp_compare: Option<cmpfunc>,
387    pub tp_repr: Option<reprfunc>,
388    pub tp_as_number: *mut PyNumberMethods,
389    pub tp_as_sequence: *mut PySequenceMethods,
390    pub tp_as_mapping: *mut PyMappingMethods,
391    pub tp_hash: Option<hashfunc>,
392    pub tp_call: Option<ternaryfunc>,
393    pub tp_str: Option<reprfunc>,
394    pub tp_getattro: Option<getattrofunc>,
395    pub tp_setattro: Option<setattrofunc>,
396    pub tp_as_buffer: *mut PyBufferProcs,
397    pub tp_flags: c_long,
398    pub tp_doc: *const c_char,
399    pub tp_traverse: Option<traverseproc>,
400    pub tp_clear: Option<inquiry>,
401    pub tp_richcompare: Option<richcmpfunc>,
402    pub tp_weaklistoffset: Py_ssize_t,
403    pub tp_iter: Option<getiterfunc>,
404    pub tp_iternext: Option<iternextfunc>,
405    pub tp_methods: *mut PyMethodDef,
406    pub tp_members: *mut crate::structmember::PyMemberDef,
407    pub tp_getset: *mut crate::descrobject::PyGetSetDef,
408    pub tp_base: *mut PyTypeObject,
409    pub tp_dict: *mut PyObject,
410    pub tp_descr_get: Option<descrgetfunc>,
411    pub tp_descr_set: Option<descrsetfunc>,
412    pub tp_dictoffset: Py_ssize_t,
413    pub tp_init: Option<initproc>,
414    pub tp_alloc: Option<allocfunc>,
415    pub tp_new: Option<newfunc>,
416    pub tp_free: Option<freefunc>,
417    pub tp_is_gc: Option<inquiry>,
418    pub tp_bases: *mut PyObject,
419    pub tp_mro: *mut PyObject,
420    pub tp_cache: *mut PyObject,
421    pub tp_subclasses: *mut PyObject,
422    pub tp_weaklist: *mut PyObject,
423    pub tp_del: Option<destructor>,
424    pub tp_version_tag: c_uint,
425    #[cfg(py_sys_config = "COUNT_ALLOCS")]
426    pub tp_allocs: Py_ssize_t,
427    #[cfg(py_sys_config = "COUNT_ALLOCS")]
428    pub tp_frees: Py_ssize_t,
429    #[cfg(py_sys_config = "COUNT_ALLOCS")]
430    pub tp_maxalloc: Py_ssize_t,
431    #[cfg(py_sys_config = "COUNT_ALLOCS")]
432    pub tp_prev: *mut PyTypeObject,
433    #[cfg(py_sys_config = "COUNT_ALLOCS")]
434    pub tp_next: *mut PyTypeObject,
435}
436
437impl Clone for PyTypeObject {
438    #[inline]
439    fn clone(&self) -> PyTypeObject {
440        *self
441    }
442}
443
444#[cfg(py_sys_config = "Py_TRACE_REFS")]
445pub const PyTypeObject_INIT: PyTypeObject = PyTypeObject {
446    _ob_next: 0 as *mut PyObject,
447    _ob_prev: 0 as *mut PyObject,
448    ob_refcnt: 1,
449    ob_type: 0 as *mut PyTypeObject,
450    ob_size: 0,
451    tp_name: 0 as *const c_char,
452    tp_basicsize: 0,
453    tp_itemsize: 0,
454    tp_dealloc: None,
455    tp_print: None,
456    tp_getattr: None,
457    tp_setattr: None,
458    tp_compare: None,
459    tp_repr: None,
460    tp_as_number: 0 as *mut PyNumberMethods,
461    tp_as_sequence: 0 as *mut PySequenceMethods,
462    tp_as_mapping: 0 as *mut PyMappingMethods,
463    tp_hash: None,
464    tp_call: None,
465    tp_str: None,
466    tp_getattro: None,
467    tp_setattro: None,
468    tp_as_buffer: 0 as *mut PyBufferProcs,
469    tp_flags: Py_TPFLAGS_DEFAULT,
470    tp_doc: 0 as *const c_char,
471    tp_traverse: None,
472    tp_clear: None,
473    tp_richcompare: None,
474    tp_weaklistoffset: 0,
475    tp_iter: None,
476    tp_iternext: None,
477    tp_methods: 0 as *mut PyMethodDef,
478    tp_members: 0 as *mut crate::structmember::PyMemberDef,
479    tp_getset: 0 as *mut crate::descrobject::PyGetSetDef,
480    tp_base: 0 as *mut PyTypeObject,
481    tp_dict: 0 as *mut PyObject,
482    tp_descr_get: None,
483    tp_descr_set: None,
484    tp_dictoffset: 0,
485    tp_init: None,
486    tp_alloc: None,
487    tp_new: None,
488    tp_free: None,
489    tp_is_gc: None,
490    tp_bases: 0 as *mut PyObject,
491    tp_mro: 0 as *mut PyObject,
492    tp_cache: 0 as *mut PyObject,
493    tp_subclasses: 0 as *mut PyObject,
494    tp_weaklist: 0 as *mut PyObject,
495    tp_del: None,
496    tp_version_tag: 0,
497};
498
499#[cfg(not(py_sys_config = "Py_TRACE_REFS"))]
500pub const PyTypeObject_INIT: PyTypeObject = PyTypeObject {
501    ob_refcnt: 1,
502    ob_type: 0 as *mut PyTypeObject,
503    ob_size: 0,
504    tp_name: 0 as *const c_char,
505    tp_basicsize: 0,
506    tp_itemsize: 0,
507    tp_dealloc: None,
508    tp_print: None,
509    tp_getattr: None,
510    tp_setattr: None,
511    tp_compare: None,
512    tp_repr: None,
513    tp_as_number: 0 as *mut PyNumberMethods,
514    tp_as_sequence: 0 as *mut PySequenceMethods,
515    tp_as_mapping: 0 as *mut PyMappingMethods,
516    tp_hash: None,
517    tp_call: None,
518    tp_str: None,
519    tp_getattro: None,
520    tp_setattro: None,
521    tp_as_buffer: 0 as *mut PyBufferProcs,
522    tp_flags: Py_TPFLAGS_DEFAULT,
523    tp_doc: 0 as *const c_char,
524    tp_traverse: None,
525    tp_clear: None,
526    tp_richcompare: None,
527    tp_weaklistoffset: 0,
528    tp_iter: None,
529    tp_iternext: None,
530    tp_methods: 0 as *mut PyMethodDef,
531    tp_members: 0 as *mut crate::structmember::PyMemberDef,
532    tp_getset: 0 as *mut crate::descrobject::PyGetSetDef,
533    tp_base: 0 as *mut PyTypeObject,
534    tp_dict: 0 as *mut PyObject,
535    tp_descr_get: None,
536    tp_descr_set: None,
537    tp_dictoffset: 0,
538    tp_init: None,
539    tp_alloc: None,
540    tp_new: None,
541    tp_free: None,
542    tp_is_gc: None,
543    tp_bases: 0 as *mut PyObject,
544    tp_mro: 0 as *mut PyObject,
545    tp_cache: 0 as *mut PyObject,
546    tp_subclasses: 0 as *mut PyObject,
547    tp_weaklist: 0 as *mut PyObject,
548    tp_del: None,
549    tp_version_tag: 0,
550};
551
552impl PyTypeObject {
553    #[inline]
554    pub fn init_ob_type(&mut self, type_object: *mut PyTypeObject) {
555        self.ob_type = type_object;
556    }
557}
558
559#[repr(C)]
560#[derive(Copy)]
561pub struct PyHeapTypeObject {
562    pub ht_type: PyTypeObject,
563    pub as_number: PyNumberMethods,
564    pub as_mapping: PyMappingMethods,
565    pub as_sequence: PySequenceMethods,
566    pub as_buffer: PyBufferProcs,
567    pub ht_name: *mut PyObject,
568    pub ht_slots: *mut PyObject,
569}
570
571impl Clone for PyHeapTypeObject {
572    #[inline]
573    fn clone(&self) -> PyHeapTypeObject {
574        *self
575    }
576}
577
578// access macro to the members which are floating "behind" the object
579#[inline]
580pub unsafe fn PyHeapType_GET_MEMBERS(
581    etype: *mut PyHeapTypeObject,
582) -> *mut crate::structmember::PyMemberDef {
583    let basicsize = (*Py_TYPE(etype as *mut PyObject)).tp_basicsize;
584    (etype as *mut u8).offset(basicsize as isize) as *mut crate::structmember::PyMemberDef
585}
586
587#[cfg_attr(windows, link(name = "pythonXY"))]
588extern "C" {
589    pub fn PyType_IsSubtype(a: *mut PyTypeObject, b: *mut PyTypeObject) -> c_int;
590}
591
592#[inline(always)]
593pub unsafe fn PyObject_TypeCheck(ob: *mut PyObject, tp: *mut PyTypeObject) -> c_int {
594    (Py_TYPE(ob) == tp || PyType_IsSubtype(Py_TYPE(ob), tp) != 0) as c_int
595}
596
597#[cfg_attr(windows, link(name = "pythonXY"))]
598extern "C" {
599    pub static mut PyType_Type: PyTypeObject;
600    pub static mut PyBaseObject_Type: PyTypeObject;
601    pub static mut PySuper_Type: PyTypeObject;
602}
603
604#[inline(always)]
605pub unsafe fn PyType_Check(op: *mut PyObject) -> c_int {
606    PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_TYPE_SUBCLASS)
607}
608
609#[inline(always)]
610pub unsafe fn PyType_CheckExact(op: *mut PyObject) -> c_int {
611    (Py_TYPE(op) == (&mut PyType_Type as *mut _)) as c_int
612}
613
614#[cfg_attr(windows, link(name = "pythonXY"))]
615extern "C" {
616    pub fn PyType_Ready(t: *mut PyTypeObject) -> c_int;
617    pub fn PyType_GenericAlloc(t: *mut PyTypeObject, nitems: Py_ssize_t) -> *mut PyObject;
618    pub fn PyType_GenericNew(
619        t: *mut PyTypeObject,
620        args: *mut PyObject,
621        kwds: *mut PyObject,
622    ) -> *mut PyObject;
623    fn _PyType_Lookup(arg1: *mut PyTypeObject, arg2: *mut PyObject) -> *mut PyObject;
624    fn _PyObject_LookupSpecial(
625        arg1: *mut PyObject,
626        arg2: *mut c_char,
627        arg3: *mut *mut PyObject,
628    ) -> *mut PyObject;
629    pub fn PyType_ClearCache() -> c_uint;
630    pub fn PyType_Modified(t: *mut PyTypeObject);
631
632    pub fn PyObject_Print(o: *mut PyObject, fp: *mut FILE, flags: c_int) -> c_int;
633    fn _PyObject_Dump(o: *mut PyObject);
634    pub fn PyObject_Repr(o: *mut PyObject) -> *mut PyObject;
635    fn _PyObject_Str(o: *mut PyObject) -> *mut PyObject;
636    pub fn PyObject_Str(o: *mut PyObject) -> *mut PyObject;
637}
638
639#[inline(always)]
640pub unsafe fn PyObject_Bytes(o: *mut PyObject) -> *mut PyObject {
641    PyObject_Str(o)
642}
643
644#[cfg_attr(windows, link(name = "pythonXY"))]
645extern "C" {
646    #[cfg(py_sys_config = "Py_USING_UNICODE")]
647    pub fn PyObject_Unicode(o: *mut PyObject) -> *mut PyObject;
648
649    pub fn PyObject_Compare(arg1: *mut PyObject, arg2: *mut PyObject) -> c_int;
650    pub fn PyObject_RichCompare(
651        arg1: *mut PyObject,
652        arg2: *mut PyObject,
653        arg3: c_int,
654    ) -> *mut PyObject;
655    pub fn PyObject_RichCompareBool(arg1: *mut PyObject, arg2: *mut PyObject, arg3: c_int)
656        -> c_int;
657    pub fn PyObject_GetAttrString(arg1: *mut PyObject, arg2: *const c_char) -> *mut PyObject;
658    pub fn PyObject_SetAttrString(
659        arg1: *mut PyObject,
660        arg2: *const c_char,
661        arg3: *mut PyObject,
662    ) -> c_int;
663    pub fn PyObject_HasAttrString(arg1: *mut PyObject, arg2: *const c_char) -> c_int;
664    pub fn PyObject_GetAttr(arg1: *mut PyObject, arg2: *mut PyObject) -> *mut PyObject;
665    pub fn PyObject_SetAttr(arg1: *mut PyObject, arg2: *mut PyObject, arg3: *mut PyObject)
666        -> c_int;
667    pub fn PyObject_HasAttr(arg1: *mut PyObject, arg2: *mut PyObject) -> c_int;
668    fn _PyObject_GetDictPtr(arg1: *mut PyObject) -> *mut *mut PyObject;
669    pub fn PyObject_SelfIter(arg1: *mut PyObject) -> *mut PyObject;
670    pub fn PyObject_GenericGetAttr(arg1: *mut PyObject, arg2: *mut PyObject) -> *mut PyObject;
671    pub fn PyObject_GenericSetAttr(
672        arg1: *mut PyObject,
673        arg2: *mut PyObject,
674        arg3: *mut PyObject,
675    ) -> c_int;
676    pub fn PyObject_Hash(arg1: *mut PyObject) -> c_long;
677    pub fn PyObject_HashNotImplemented(arg1: *mut PyObject) -> c_long;
678    pub fn PyObject_IsTrue(arg1: *mut PyObject) -> c_int;
679    pub fn PyObject_Not(arg1: *mut PyObject) -> c_int;
680    pub fn PyCallable_Check(arg1: *mut PyObject) -> c_int;
681    pub fn PyNumber_Coerce(arg1: *mut *mut PyObject, arg2: *mut *mut PyObject) -> c_int;
682    pub fn PyNumber_CoerceEx(arg1: *mut *mut PyObject, arg2: *mut *mut PyObject) -> c_int;
683    pub fn PyObject_ClearWeakRefs(arg1: *mut PyObject);
684    fn _PyObject_SlotCompare(arg1: *mut PyObject, arg2: *mut PyObject) -> c_int;
685    fn _PyObject_GenericGetAttrWithDict(
686        arg1: *mut PyObject,
687        arg2: *mut PyObject,
688        arg3: *mut PyObject,
689    ) -> *mut PyObject;
690    fn _PyObject_GenericSetAttrWithDict(
691        arg1: *mut PyObject,
692        arg2: *mut PyObject,
693        arg3: *mut PyObject,
694        arg4: *mut PyObject,
695    ) -> c_int;
696    pub fn PyObject_Dir(arg1: *mut PyObject) -> *mut PyObject;
697    pub fn Py_ReprEnter(arg1: *mut PyObject) -> c_int;
698    pub fn Py_ReprLeave(arg1: *mut PyObject);
699    fn _Py_HashDouble(arg1: c_double) -> c_long;
700    fn _Py_HashPointer(arg1: *mut c_void) -> c_long;
701}
702
703// Flag bits for printing:
704pub const Py_PRINT_RAW: c_int = 1; // No string quotes etc.
705
706/// PyBufferProcs contains bf_getcharbuffer
707pub const Py_TPFLAGS_HAVE_GETCHARBUFFER: c_long = (1 << 0);
708
709/// PySequenceMethods contains sq_contains
710pub const Py_TPFLAGS_HAVE_SEQUENCE_IN: c_long = (1 << 1);
711
712/// PySequenceMethods and PyNumberMethods contain in-place operators
713pub const Py_TPFLAGS_HAVE_INPLACEOPS: c_long = (1 << 3);
714
715/// PyNumberMethods do their own coercion
716pub const Py_TPFLAGS_CHECKTYPES: c_long = (1 << 4);
717
718/// tp_richcompare is defined
719pub const Py_TPFLAGS_HAVE_RICHCOMPARE: c_long = (1 << 5);
720
721/// Objects which are weakly referencable if their tp_weaklistoffset is >0
722pub const Py_TPFLAGS_HAVE_WEAKREFS: c_long = (1 << 6);
723
724/// tp_iter is defined
725pub const Py_TPFLAGS_HAVE_ITER: c_long = (1 << 7);
726
727/// New members introduced by Python 2.2 exist
728pub const Py_TPFLAGS_HAVE_CLASS: c_long = (1 << 8);
729
730/// Set if the type object is dynamically allocated
731pub const Py_TPFLAGS_HEAPTYPE: c_long = (1 << 9);
732
733/// Set if the type allows subclassing
734pub const Py_TPFLAGS_BASETYPE: c_long = (1 << 10);
735
736/// Set if the type is 'ready' -- fully initialized
737pub const Py_TPFLAGS_READY: c_long = (1 << 12);
738
739/// Set while the type is being 'readied', to prevent recursive ready calls
740pub const Py_TPFLAGS_READYING: c_long = (1 << 13);
741
742/// Objects support garbage collection (see objimp.h)
743pub const Py_TPFLAGS_HAVE_GC: c_long = (1 << 14);
744
745// Two bits are preserved for Stackless Python, next after this is 17.
746const Py_TPFLAGS_HAVE_STACKLESS_EXTENSION: c_long = 0;
747
748/// Objects support nb_index in PyNumberMethods
749pub const Py_TPFLAGS_HAVE_INDEX: c_long = (1 << 17);
750
751/// Objects support type attribute cache
752pub const Py_TPFLAGS_HAVE_VERSION_TAG: c_long = (1 << 18);
753pub const Py_TPFLAGS_VALID_VERSION_TAG: c_long = (1 << 19);
754
755/* Type is abstract and cannot be instantiated */
756pub const Py_TPFLAGS_IS_ABSTRACT: c_long = (1 << 20);
757
758/* Has the new buffer protocol */
759pub const Py_TPFLAGS_HAVE_NEWBUFFER: c_long = (1 << 21);
760
761/* These flags are used to determine if a type is a subclass. */
762pub const Py_TPFLAGS_INT_SUBCLASS: c_long = (1 << 23);
763pub const Py_TPFLAGS_LONG_SUBCLASS: c_long = (1 << 24);
764pub const Py_TPFLAGS_LIST_SUBCLASS: c_long = (1 << 25);
765pub const Py_TPFLAGS_TUPLE_SUBCLASS: c_long = (1 << 26);
766pub const Py_TPFLAGS_STRING_SUBCLASS: c_long = (1 << 27);
767pub const Py_TPFLAGS_UNICODE_SUBCLASS: c_long = (1 << 28);
768pub const Py_TPFLAGS_DICT_SUBCLASS: c_long = (1 << 29);
769pub const Py_TPFLAGS_BASE_EXC_SUBCLASS: c_long = (1 << 30);
770pub const Py_TPFLAGS_TYPE_SUBCLASS: c_long = (1 << 31);
771
772pub const Py_TPFLAGS_DEFAULT: c_long = (Py_TPFLAGS_HAVE_GETCHARBUFFER
773    | Py_TPFLAGS_HAVE_SEQUENCE_IN
774    | Py_TPFLAGS_HAVE_INPLACEOPS
775    | Py_TPFLAGS_HAVE_RICHCOMPARE
776    | Py_TPFLAGS_HAVE_WEAKREFS
777    | Py_TPFLAGS_HAVE_ITER
778    | Py_TPFLAGS_HAVE_CLASS
779    | Py_TPFLAGS_HAVE_STACKLESS_EXTENSION
780    | Py_TPFLAGS_HAVE_INDEX
781    | 0);
782
783#[inline(always)]
784pub unsafe fn PyType_HasFeature(t: *mut PyTypeObject, f: c_long) -> c_int {
785    (((*t).tp_flags & f) != 0) as c_int
786}
787
788#[inline(always)]
789pub unsafe fn PyType_FastSubclass(t: *mut PyTypeObject, f: c_long) -> c_int {
790    PyType_HasFeature(t, f)
791}
792
793// Reference counting macros.
794#[inline(always)]
795pub unsafe fn Py_INCREF(op: *mut PyObject) {
796    if cfg!(py_sys_config = "Py_REF_DEBUG") {
797        Py_IncRef(op)
798    } else {
799        (*op).ob_refcnt += 1
800    }
801}
802
803#[inline(always)]
804pub unsafe fn Py_DECREF(op: *mut PyObject) {
805    if cfg!(py_sys_config = "Py_REF_DEBUG") || cfg!(py_sys_config = "COUNT_ALLOCS") {
806        Py_DecRef(op)
807    } else {
808        (*op).ob_refcnt -= 1;
809        if (*op).ob_refcnt == 0 {
810            (*Py_TYPE(op)).tp_dealloc.unwrap()(op)
811        }
812    }
813}
814
815#[inline(always)]
816pub unsafe fn Py_CLEAR(op: &mut *mut PyObject) {
817    let tmp = *op;
818    if !tmp.is_null() {
819        *op = ptr::null_mut();
820        Py_DECREF(tmp);
821    }
822}
823
824#[inline(always)]
825pub unsafe fn Py_XINCREF(op: *mut PyObject) {
826    if !op.is_null() {
827        Py_INCREF(op)
828    }
829}
830
831#[inline(always)]
832pub unsafe fn Py_XDECREF(op: *mut PyObject) {
833    if !op.is_null() {
834        Py_DECREF(op)
835    }
836}
837
838#[cfg_attr(windows, link(name = "pythonXY"))]
839extern "C" {
840    pub fn Py_IncRef(o: *mut PyObject);
841    pub fn Py_DecRef(o: *mut PyObject);
842
843    static mut _Py_NoneStruct: PyObject;
844    static mut _Py_NotImplementedStruct: PyObject;
845}
846
847#[inline(always)]
848pub unsafe fn Py_None() -> *mut PyObject {
849    &mut _Py_NoneStruct
850}
851
852#[inline(always)]
853pub unsafe fn Py_NotImplemented() -> *mut PyObject {
854    &mut _Py_NotImplementedStruct
855}
856
857/* Rich comparison opcodes */
858pub const Py_LT: c_int = 0;
859pub const Py_LE: c_int = 1;
860pub const Py_EQ: c_int = 2;
861pub const Py_NE: c_int = 3;
862pub const Py_GT: c_int = 4;
863pub const Py_GE: c_int = 5;
864
865#[cfg_attr(windows, link(name = "pythonXY"))]
866extern "C" {
867    fn _PyTrash_thread_deposit_object(o: *mut PyObject);
868    fn _PyTrash_thread_destroy_chain();
869}
870
871pub const PyTrash_UNWIND_LEVEL: c_int = 50;
872
873#[inline(always)]
874pub unsafe fn Py_TRASHCAN<F: FnOnce() -> ()>(op: *mut PyObject, body: F) {
875    let tstate = crate::pystate::PyThreadState_GET();
876    if tstate.is_null() || (*tstate).trash_delete_nesting < PyTrash_UNWIND_LEVEL {
877        if !tstate.is_null() {
878            (*tstate).trash_delete_nesting += 1;
879        }
880        body();
881        if !tstate.is_null() {
882            (*tstate).trash_delete_nesting -= 1;
883            if !(*tstate).trash_delete_later.is_null() && (*tstate).trash_delete_nesting <= 0 {
884                _PyTrash_thread_destroy_chain();
885            }
886        }
887    } else {
888        _PyTrash_thread_deposit_object(op)
889    }
890}