Skip to main content

pyforge_ffi/cpython/
object.rs

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// skipped private _Py_NewReference
7// skipped private _Py_NewReferenceNoTotal
8// skipped private _Py_ResurrectReference
9
10// skipped private _Py_GetGlobalRefTotal
11// skipped private _Py_GetRefTotal
12// skipped private _Py_GetLegacyRefTotal
13// skipped private _PyInterpreterState_GetRefTotal
14
15// skipped private _Py_Identifier
16
17// skipped private _Py_static_string_init
18// skipped private _Py_static_string
19// skipped private _Py_IDENTIFIER
20
21#[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
219// skipped private _PyType_Name
220// skipped private _PyType_Lookup
221// skipped private _PyType_LookupRef
222
223extern_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    // skipped private _Py_BreakPoint
230    // skipped private _PyObject_Dump
231
232    // skipped _PyObject_GetAttrId
233
234    // skipped private _PyObject_GetDictPtr
235    pub fn PyObject_CallFinalizer(arg1: *mut PyObject);
236    pub fn PyObject_CallFinalizerFromDealloc(arg1: *mut PyObject) -> c_int;
237
238    // skipped private _PyObject_GenericGetAttrWithDict
239    // skipped private _PyObject_GenericSetAttrWithDict
240    // skipped private _PyObject_FunctionStr
241}
242
243// skipped Py_SETREF
244// skipped Py_XSETREF
245
246// skipped private _PyObject_ASSERT_FROM
247// skipped private _PyObject_ASSERT_WITH_MSG
248// skipped private _PyObject_ASSERT
249// skipped private _PyObject_ASSERT_FAILED_MSG
250// skipped private _PyObject_AssertFailed
251
252// skipped private _PyTrash_begin
253// skipped private _PyTrash_end
254
255// skipped _PyTrash_thread_deposit_object
256// skipped _PyTrash_thread_destroy_chain
257
258// skipped Py_TRASHCAN_BEGIN
259// skipped Py_TRASHCAN_END
260
261// skipped PyObject_GetItemData
262
263// skipped PyObject_VisitManagedDict
264// skipped _PyObject_SetManagedDict
265// skipped PyObject_ClearManagedDict
266
267// skipped TYPE_MAX_WATCHERS
268
269// skipped PyType_WatchCallback
270// skipped PyType_AddWatcher
271// skipped PyType_ClearWatcher
272// skipped PyType_Watch
273// skipped PyType_Unwatch
274
275// skipped PyUnstable_Type_AssignVersionTag
276
277// skipped PyRefTracerEvent
278
279// skipped PyRefTracer
280// skipped PyRefTracer_SetTracer
281// skipped PyRefTracer_GetTracer
282
283#[cfg(Py_3_14)]
284extern_libpython! {
285    // skipped PyUnstable_Object_EnableDeferredRefcount
286
287    pub fn PyUnstable_Object_IsUniqueReferencedTemporary(obj: *mut PyObject) -> c_int;
288
289    // skipped PyUnstable_IsImmortal
290
291    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}