1use crate::vectorcallfunc;
2use crate::{object, PyGetSetDef, PyMemberDef, PyMethodDef, PyObject, Py_ssize_t};
3use std::ffi::{c_char, c_int, c_uint, c_void};
4use std::mem;
5
6#[repr(C)]
22#[derive(Copy, Clone)]
23pub struct PyNumberMethods {
24 pub nb_add: Option<object::binaryfunc>,
25 pub nb_subtract: Option<object::binaryfunc>,
26 pub nb_multiply: Option<object::binaryfunc>,
27 pub nb_remainder: Option<object::binaryfunc>,
28 pub nb_divmod: Option<object::binaryfunc>,
29 pub nb_power: Option<object::ternaryfunc>,
30 pub nb_negative: Option<object::unaryfunc>,
31 pub nb_positive: Option<object::unaryfunc>,
32 pub nb_absolute: Option<object::unaryfunc>,
33 pub nb_bool: Option<object::inquiry>,
34 pub nb_invert: Option<object::unaryfunc>,
35 pub nb_lshift: Option<object::binaryfunc>,
36 pub nb_rshift: Option<object::binaryfunc>,
37 pub nb_and: Option<object::binaryfunc>,
38 pub nb_xor: Option<object::binaryfunc>,
39 pub nb_or: Option<object::binaryfunc>,
40 pub nb_int: Option<object::unaryfunc>,
41 pub nb_reserved: *mut c_void,
42 pub nb_float: Option<object::unaryfunc>,
43 pub nb_inplace_add: Option<object::binaryfunc>,
44 pub nb_inplace_subtract: Option<object::binaryfunc>,
45 pub nb_inplace_multiply: Option<object::binaryfunc>,
46 pub nb_inplace_remainder: Option<object::binaryfunc>,
47 pub nb_inplace_power: Option<object::ternaryfunc>,
48 pub nb_inplace_lshift: Option<object::binaryfunc>,
49 pub nb_inplace_rshift: Option<object::binaryfunc>,
50 pub nb_inplace_and: Option<object::binaryfunc>,
51 pub nb_inplace_xor: Option<object::binaryfunc>,
52 pub nb_inplace_or: Option<object::binaryfunc>,
53 pub nb_floor_divide: Option<object::binaryfunc>,
54 pub nb_true_divide: Option<object::binaryfunc>,
55 pub nb_inplace_floor_divide: Option<object::binaryfunc>,
56 pub nb_inplace_true_divide: Option<object::binaryfunc>,
57 pub nb_index: Option<object::unaryfunc>,
58 pub nb_matrix_multiply: Option<object::binaryfunc>,
59 pub nb_inplace_matrix_multiply: Option<object::binaryfunc>,
60}
61
62#[repr(C)]
63#[derive(Clone)]
64pub struct PySequenceMethods {
65 pub sq_length: Option<object::lenfunc>,
66 pub sq_concat: Option<object::binaryfunc>,
67 pub sq_repeat: Option<object::ssizeargfunc>,
68 pub sq_item: Option<object::ssizeargfunc>,
69 pub was_sq_slice: *mut c_void,
70 pub sq_ass_item: Option<object::ssizeobjargproc>,
71 pub was_sq_ass_slice: *mut c_void,
72 pub sq_contains: Option<object::objobjproc>,
73 pub sq_inplace_concat: Option<object::binaryfunc>,
74 pub sq_inplace_repeat: Option<object::ssizeargfunc>,
75}
76
77#[repr(C)]
78#[derive(Clone, Default)]
79pub struct PyMappingMethods {
80 pub mp_length: Option<object::lenfunc>,
81 pub mp_subscript: Option<object::binaryfunc>,
82 pub mp_ass_subscript: Option<object::objobjargproc>,
83}
84
85pub type sendfunc = unsafe extern "C" fn(
86 iter: *mut PyObject,
87 value: *mut PyObject,
88 result: *mut *mut PyObject,
89) -> object::PySendResult;
90
91#[repr(C)]
92#[derive(Clone, Default)]
93pub struct PyAsyncMethods {
94 pub am_await: Option<object::unaryfunc>,
95 pub am_aiter: Option<object::unaryfunc>,
96 pub am_anext: Option<object::unaryfunc>,
97 pub am_send: Option<sendfunc>,
98}
99
100#[repr(C)]
101#[derive(Clone, Default)]
102pub struct PyBufferProcs {
103 pub bf_getbuffer: Option<crate::getbufferproc>,
104 pub bf_releasebuffer: Option<crate::releasebufferproc>,
105}
106
107pub type printfunc =
108 unsafe extern "C" fn(arg1: *mut PyObject, arg2: *mut ::libc::FILE, arg3: c_int) -> c_int;
109
110#[repr(C)]
111#[derive(Debug)]
112pub struct PyTypeObject {
113 pub ob_base: object::PyVarObject,
114 pub tp_name: *const c_char,
115 pub tp_basicsize: Py_ssize_t,
116 pub tp_itemsize: Py_ssize_t,
117 pub tp_dealloc: Option<object::destructor>,
118 pub tp_vectorcall_offset: Py_ssize_t,
119 pub tp_getattr: Option<object::getattrfunc>,
120 pub tp_setattr: Option<object::setattrfunc>,
121 pub tp_as_async: *mut PyAsyncMethods,
122 pub tp_repr: Option<object::reprfunc>,
123 pub tp_as_number: *mut PyNumberMethods,
124 pub tp_as_sequence: *mut PySequenceMethods,
125 pub tp_as_mapping: *mut PyMappingMethods,
126 pub tp_hash: Option<object::hashfunc>,
127 pub tp_call: Option<object::ternaryfunc>,
128 pub tp_str: Option<object::reprfunc>,
129 pub tp_getattro: Option<object::getattrofunc>,
130 pub tp_setattro: Option<object::setattrofunc>,
131 pub tp_as_buffer: *mut PyBufferProcs,
132 #[cfg(not(Py_GIL_DISABLED))]
133 pub tp_flags: std::ffi::c_ulong,
134 #[cfg(Py_GIL_DISABLED)]
135 pub tp_flags: crate::impl_::AtomicCULong,
136 pub tp_doc: *const c_char,
137 pub tp_traverse: Option<object::traverseproc>,
138 pub tp_clear: Option<object::inquiry>,
139 pub tp_richcompare: Option<object::richcmpfunc>,
140 pub tp_weaklistoffset: Py_ssize_t,
141 pub tp_iter: Option<object::getiterfunc>,
142 pub tp_iternext: Option<object::iternextfunc>,
143 pub tp_methods: *mut PyMethodDef,
144 pub tp_members: *mut PyMemberDef,
145 pub tp_getset: *mut PyGetSetDef,
146 pub tp_base: *mut PyTypeObject,
147 pub tp_dict: *mut object::PyObject,
148 pub tp_descr_get: Option<object::descrgetfunc>,
149 pub tp_descr_set: Option<object::descrsetfunc>,
150 pub tp_dictoffset: Py_ssize_t,
151 pub tp_init: Option<object::initproc>,
152 pub tp_alloc: Option<object::allocfunc>,
153 pub tp_new: Option<object::newfunc>,
154 pub tp_free: Option<object::freefunc>,
155 pub tp_is_gc: Option<object::inquiry>,
156 pub tp_bases: *mut object::PyObject,
157 pub tp_mro: *mut object::PyObject,
158 pub tp_cache: *mut object::PyObject,
159 pub tp_subclasses: *mut object::PyObject,
160 pub tp_weaklist: *mut object::PyObject,
161 pub tp_del: Option<object::destructor>,
162 pub tp_version_tag: c_uint,
163 pub tp_finalize: Option<object::destructor>,
164 pub tp_vectorcall: Option<vectorcallfunc>,
165 #[cfg(Py_3_12)]
166 pub tp_watched: c_char,
167 #[cfg(py_sys_config = "COUNT_ALLOCS")]
168 pub tp_allocs: Py_ssize_t,
169 #[cfg(py_sys_config = "COUNT_ALLOCS")]
170 pub tp_frees: Py_ssize_t,
171 #[cfg(py_sys_config = "COUNT_ALLOCS")]
172 pub tp_maxalloc: Py_ssize_t,
173 #[cfg(py_sys_config = "COUNT_ALLOCS")]
174 pub tp_prev: *mut PyTypeObject,
175 #[cfg(py_sys_config = "COUNT_ALLOCS")]
176 pub tp_next: *mut PyTypeObject,
177 #[cfg(Py_3_13)]
178 pub tp_versions_used: u16,
179}
180
181#[repr(C)]
182#[derive(Clone)]
183struct _specialization_cache {
184 getitem: *mut PyObject,
185 #[cfg(Py_3_12)]
186 getitem_version: u32,
187 #[cfg(Py_3_13)]
188 init: *mut PyObject,
189}
190
191#[repr(C)]
192pub struct PyHeapTypeObject {
193 pub ht_type: PyTypeObject,
194 pub as_async: PyAsyncMethods,
195 pub as_number: PyNumberMethods,
196 pub as_mapping: PyMappingMethods,
197 pub as_sequence: PySequenceMethods,
198 pub as_buffer: PyBufferProcs,
199 pub ht_name: *mut object::PyObject,
200 pub ht_slots: *mut object::PyObject,
201 pub ht_qualname: *mut object::PyObject,
202 pub ht_cached_keys: *mut c_void,
203 pub ht_module: *mut object::PyObject,
204 _ht_tpname: *mut c_char,
205 #[cfg(Py_3_14)]
206 pub ht_token: *mut c_void,
207 _spec_cache: _specialization_cache,
208 #[cfg(all(Py_GIL_DISABLED, Py_3_14))]
209 pub unique_id: Py_ssize_t,
210}
211
212impl Default for PyHeapTypeObject {
213 #[inline]
214 fn default() -> Self {
215 unsafe { mem::zeroed() }
216 }
217}
218
219extern_libpython! {
224 #[cfg(Py_3_12)]
225 pub fn PyType_GetDict(o: *mut PyTypeObject) -> *mut PyObject;
226
227 pub fn PyObject_Print(o: *mut PyObject, fp: *mut ::libc::FILE, flags: c_int) -> c_int;
228
229 pub fn PyObject_CallFinalizer(arg1: *mut PyObject);
236 pub fn PyObject_CallFinalizerFromDealloc(arg1: *mut PyObject) -> c_int;
237
238 }
242
243#[cfg(Py_3_14)]
284extern_libpython! {
285 pub fn PyUnstable_Object_IsUniqueReferencedTemporary(obj: *mut PyObject) -> c_int;
288
289 pub fn PyUnstable_TryIncRef(obj: *mut PyObject) -> c_int;
292
293 pub fn PyUnstable_EnableTryIncRef(obj: *mut PyObject) -> c_void;
294
295 pub fn PyUnstable_Object_IsUniquelyReferenced(op: *mut PyObject) -> c_int;
296}
297
298#[cfg(Py_3_15)]
299extern_libpython! {
300 pub fn PyUnstable_SetImmortal(op: *mut PyObject) -> c_int;
301}