1use crate::pyport::{Py_hash_t, Py_ssize_t};
2#[cfg(Py_GIL_DISABLED)]
3use crate::refcount;
4#[cfg(Py_GIL_DISABLED)]
5use crate::PyMutex;
6use std::ffi::{c_char, c_int, c_uint, c_ulong, c_void};
7use std::mem;
8use std::ptr;
9#[cfg(Py_GIL_DISABLED)]
10use std::sync::atomic::{AtomicIsize, AtomicU32};
11
12#[cfg(Py_LIMITED_API)]
13opaque_struct!(pub PyTypeObject);
14
15#[cfg(not(Py_LIMITED_API))]
16pub use crate::cpython::object::PyTypeObject;
17
18#[repr(C)]
21#[derive(Copy, Clone)]
22#[cfg(all(
23 target_pointer_width = "64",
24 Py_3_14,
25 not(Py_GIL_DISABLED),
26 target_endian = "big"
27))]
28pub struct PyObjectObFlagsAndRefcnt {
31 pub ob_flags: u16,
32 pub ob_overflow: u16,
33 pub ob_refcnt: u32,
34}
35
36#[repr(C)]
37#[derive(Copy, Clone)]
38#[cfg(all(
39 target_pointer_width = "64",
40 Py_3_14,
41 not(Py_GIL_DISABLED),
42 target_endian = "little"
43))]
44pub struct PyObjectObFlagsAndRefcnt {
47 pub ob_refcnt: u32,
48 pub ob_overflow: u16,
49 pub ob_flags: u16,
50}
51
52#[repr(C)]
53#[derive(Copy, Clone)]
54#[cfg(all(Py_3_12, not(Py_GIL_DISABLED)))]
55pub union PyObjectObRefcnt {
58 #[cfg(all(target_pointer_width = "64", Py_3_14))]
59 pub ob_refcnt_full: crate::PY_INT64_T,
60 #[cfg(all(target_pointer_width = "64", Py_3_14))]
61 pub refcnt_and_flags: PyObjectObFlagsAndRefcnt,
62 pub ob_refcnt: Py_ssize_t,
63 #[cfg(all(target_pointer_width = "64", not(Py_3_14)))]
64 pub ob_refcnt_split: [crate::PY_UINT32_T; 2],
65}
66
67#[cfg(all(Py_3_12, not(Py_GIL_DISABLED)))]
68impl std::fmt::Debug for PyObjectObRefcnt {
69 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
70 write!(f, "{}", unsafe { self.ob_refcnt })
71 }
72}
73
74#[cfg(all(not(Py_3_12), not(Py_GIL_DISABLED)))]
75pub type PyObjectObRefcnt = Py_ssize_t;
76
77#[repr(C)]
81#[derive(Debug)]
82pub struct PyObject {
83 #[cfg(py_sys_config = "Py_TRACE_REFS")]
84 pub _ob_next: *mut PyObject,
85 #[cfg(py_sys_config = "Py_TRACE_REFS")]
86 pub _ob_prev: *mut PyObject,
87 #[cfg(Py_GIL_DISABLED)]
88 pub ob_tid: libc::uintptr_t,
89 #[cfg(all(Py_GIL_DISABLED, not(Py_3_14)))]
90 pub _padding: u16,
91 #[cfg(all(Py_GIL_DISABLED, Py_3_14))]
92 pub ob_flags: u16,
93 #[cfg(Py_GIL_DISABLED)]
94 pub ob_mutex: PyMutex, #[cfg(Py_GIL_DISABLED)]
96 pub ob_gc_bits: u8, #[cfg(Py_GIL_DISABLED)]
98 pub ob_ref_local: AtomicU32, #[cfg(Py_GIL_DISABLED)]
100 pub ob_ref_shared: AtomicIsize, #[cfg(not(Py_GIL_DISABLED))]
102 pub ob_refcnt: PyObjectObRefcnt,
103 #[cfg(PyPy)]
104 pub ob_pypy_link: Py_ssize_t,
105 pub ob_type: *mut PyTypeObject,
106}
107
108#[allow(clippy::declare_interior_mutable_const)]
109pub const PyObject_HEAD_INIT: PyObject = PyObject {
110 #[cfg(py_sys_config = "Py_TRACE_REFS")]
111 _ob_next: std::ptr::null_mut(),
112 #[cfg(py_sys_config = "Py_TRACE_REFS")]
113 _ob_prev: std::ptr::null_mut(),
114 #[cfg(Py_GIL_DISABLED)]
115 ob_tid: 0,
116 #[cfg(all(Py_GIL_DISABLED, Py_3_14))]
117 ob_flags: 0,
118 #[cfg(all(Py_GIL_DISABLED, not(Py_3_14)))]
119 _padding: 0,
120 #[cfg(Py_GIL_DISABLED)]
121 ob_mutex: PyMutex::new(),
122 #[cfg(Py_GIL_DISABLED)]
123 ob_gc_bits: 0,
124 #[cfg(Py_GIL_DISABLED)]
125 ob_ref_local: AtomicU32::new(refcount::_Py_IMMORTAL_REFCNT_LOCAL),
126 #[cfg(Py_GIL_DISABLED)]
127 ob_ref_shared: AtomicIsize::new(0),
128 #[cfg(all(not(Py_GIL_DISABLED), Py_3_12))]
129 ob_refcnt: PyObjectObRefcnt { ob_refcnt: 1 },
130 #[cfg(not(Py_3_12))]
131 ob_refcnt: 1,
132 #[cfg(PyPy)]
133 ob_pypy_link: 0,
134 ob_type: std::ptr::null_mut(),
135};
136
137#[repr(C)]
142#[derive(Debug)]
143pub struct PyVarObject {
144 pub ob_base: PyObject,
145 #[cfg(not(GraalPy))]
146 pub ob_size: Py_ssize_t,
147 #[cfg(GraalPy)]
149 pub _ob_size_graalpy: Py_ssize_t,
150}
151
152#[inline]
155#[cfg(not(any(GraalPy, PyPy)))]
156#[cfg_attr(docsrs, doc(cfg(all())))]
157pub unsafe fn Py_Is(x: *mut PyObject, y: *mut PyObject) -> c_int {
158 (x == y).into()
159}
160
161#[cfg(any(GraalPy, PyPy))]
162#[cfg_attr(docsrs, doc(cfg(all())))]
163extern "C" {
164 #[cfg_attr(PyPy, link_name = "PyPy_Is")]
165 pub fn Py_Is(x: *mut PyObject, y: *mut PyObject) -> c_int;
166}
167
168#[cfg(GraalPy)]
175extern "C" {
176 #[cfg(GraalPy)]
177 fn _Py_TYPE(arg1: *const PyObject) -> *mut PyTypeObject;
178
179 #[cfg(GraalPy)]
180 fn _Py_SIZE(arg1: *const PyObject) -> Py_ssize_t;
181}
182
183#[inline]
184#[cfg(not(Py_3_14))]
185pub unsafe fn Py_TYPE(ob: *mut PyObject) -> *mut PyTypeObject {
186 #[cfg(not(GraalPy))]
187 return (*ob).ob_type;
188 #[cfg(GraalPy)]
189 return _Py_TYPE(ob);
190}
191
192#[cfg_attr(windows, link(name = "pythonXY"))]
193#[cfg(Py_3_14)]
194extern "C" {
195 #[cfg_attr(PyPy, link_name = "PyPy_TYPE")]
196 pub fn Py_TYPE(ob: *mut PyObject) -> *mut PyTypeObject;
197}
198
199#[cfg_attr(windows, link(name = "pythonXY"))]
202extern "C" {
203 #[cfg_attr(PyPy, link_name = "PyPyLong_Type")]
204 pub static mut PyLong_Type: PyTypeObject;
205 #[cfg_attr(PyPy, link_name = "PyPyBool_Type")]
206 pub static mut PyBool_Type: PyTypeObject;
207}
208
209#[inline]
210pub unsafe fn Py_SIZE(ob: *mut PyObject) -> Py_ssize_t {
211 #[cfg(not(GraalPy))]
212 {
213 debug_assert_ne!((*ob).ob_type, std::ptr::addr_of_mut!(crate::PyLong_Type));
214 debug_assert_ne!((*ob).ob_type, std::ptr::addr_of_mut!(crate::PyBool_Type));
215 (*ob.cast::<PyVarObject>()).ob_size
216 }
217 #[cfg(GraalPy)]
218 _Py_SIZE(ob)
219}
220
221#[inline]
222pub unsafe fn Py_IS_TYPE(ob: *mut PyObject, tp: *mut PyTypeObject) -> c_int {
223 (Py_TYPE(ob) == tp) as c_int
224}
225
226pub type unaryfunc = unsafe extern "C" fn(*mut PyObject) -> *mut PyObject;
231pub type binaryfunc = unsafe extern "C" fn(*mut PyObject, *mut PyObject) -> *mut PyObject;
232pub type ternaryfunc =
233 unsafe extern "C" fn(*mut PyObject, *mut PyObject, *mut PyObject) -> *mut PyObject;
234pub type inquiry = unsafe extern "C" fn(*mut PyObject) -> c_int;
235pub type lenfunc = unsafe extern "C" fn(*mut PyObject) -> Py_ssize_t;
236pub type ssizeargfunc = unsafe extern "C" fn(*mut PyObject, Py_ssize_t) -> *mut PyObject;
237pub type ssizessizeargfunc =
238 unsafe extern "C" fn(*mut PyObject, Py_ssize_t, Py_ssize_t) -> *mut PyObject;
239pub type ssizeobjargproc = unsafe extern "C" fn(*mut PyObject, Py_ssize_t, *mut PyObject) -> c_int;
240pub type ssizessizeobjargproc =
241 unsafe extern "C" fn(*mut PyObject, Py_ssize_t, Py_ssize_t, arg4: *mut PyObject) -> c_int;
242pub type objobjargproc = unsafe extern "C" fn(*mut PyObject, *mut PyObject, *mut PyObject) -> c_int;
243
244pub type objobjproc = unsafe extern "C" fn(*mut PyObject, *mut PyObject) -> c_int;
245pub type visitproc = unsafe extern "C" fn(object: *mut PyObject, arg: *mut c_void) -> c_int;
246pub type traverseproc =
247 unsafe extern "C" fn(slf: *mut PyObject, visit: visitproc, arg: *mut c_void) -> c_int;
248
249pub type freefunc = unsafe extern "C" fn(*mut c_void);
250pub type destructor = unsafe extern "C" fn(*mut PyObject);
251pub type getattrfunc = unsafe extern "C" fn(*mut PyObject, *mut c_char) -> *mut PyObject;
252pub type getattrofunc = unsafe extern "C" fn(*mut PyObject, *mut PyObject) -> *mut PyObject;
253pub type setattrfunc = unsafe extern "C" fn(*mut PyObject, *mut c_char, *mut PyObject) -> c_int;
254pub type setattrofunc = unsafe extern "C" fn(*mut PyObject, *mut PyObject, *mut PyObject) -> c_int;
255pub type reprfunc = unsafe extern "C" fn(*mut PyObject) -> *mut PyObject;
256pub type hashfunc = unsafe extern "C" fn(*mut PyObject) -> Py_hash_t;
257pub type richcmpfunc = unsafe extern "C" fn(*mut PyObject, *mut PyObject, c_int) -> *mut PyObject;
258pub type getiterfunc = unsafe extern "C" fn(*mut PyObject) -> *mut PyObject;
259pub type iternextfunc = unsafe extern "C" fn(*mut PyObject) -> *mut PyObject;
260pub type descrgetfunc =
261 unsafe extern "C" fn(*mut PyObject, *mut PyObject, *mut PyObject) -> *mut PyObject;
262pub type descrsetfunc = unsafe extern "C" fn(*mut PyObject, *mut PyObject, *mut PyObject) -> c_int;
263pub type initproc = unsafe extern "C" fn(*mut PyObject, *mut PyObject, *mut PyObject) -> c_int;
264pub type newfunc =
265 unsafe extern "C" fn(*mut PyTypeObject, *mut PyObject, *mut PyObject) -> *mut PyObject;
266pub type allocfunc = unsafe extern "C" fn(*mut PyTypeObject, Py_ssize_t) -> *mut PyObject;
267
268#[cfg(Py_3_8)]
269pub type vectorcallfunc = unsafe extern "C" fn(
270 callable: *mut PyObject,
271 args: *const *mut PyObject,
272 nargsf: libc::size_t,
273 kwnames: *mut PyObject,
274) -> *mut PyObject;
275
276#[repr(C)]
277#[derive(Copy, Clone)]
278pub struct PyType_Slot {
279 pub slot: c_int,
280 pub pfunc: *mut c_void,
281}
282
283impl Default for PyType_Slot {
284 fn default() -> PyType_Slot {
285 unsafe { mem::zeroed() }
286 }
287}
288
289#[repr(C)]
290#[derive(Copy, Clone)]
291pub struct PyType_Spec {
292 pub name: *const c_char,
293 pub basicsize: c_int,
294 pub itemsize: c_int,
295 pub flags: c_uint,
296 pub slots: *mut PyType_Slot,
297}
298
299impl Default for PyType_Spec {
300 fn default() -> PyType_Spec {
301 unsafe { mem::zeroed() }
302 }
303}
304
305extern "C" {
306 #[cfg_attr(PyPy, link_name = "PyPyType_FromSpec")]
307 pub fn PyType_FromSpec(arg1: *mut PyType_Spec) -> *mut PyObject;
308
309 #[cfg_attr(PyPy, link_name = "PyPyType_FromSpecWithBases")]
310 pub fn PyType_FromSpecWithBases(arg1: *mut PyType_Spec, arg2: *mut PyObject) -> *mut PyObject;
311
312 #[cfg_attr(PyPy, link_name = "PyPyType_GetSlot")]
313 pub fn PyType_GetSlot(arg1: *mut PyTypeObject, arg2: c_int) -> *mut c_void;
314
315 #[cfg(any(Py_3_10, all(Py_3_9, not(Py_LIMITED_API))))]
316 #[cfg_attr(PyPy, link_name = "PyPyType_FromModuleAndSpec")]
317 pub fn PyType_FromModuleAndSpec(
318 module: *mut PyObject,
319 spec: *mut PyType_Spec,
320 bases: *mut PyObject,
321 ) -> *mut PyObject;
322
323 #[cfg(any(Py_3_10, all(Py_3_9, not(Py_LIMITED_API))))]
324 #[cfg_attr(PyPy, link_name = "PyPyType_GetModule")]
325 pub fn PyType_GetModule(arg1: *mut PyTypeObject) -> *mut PyObject;
326
327 #[cfg(any(Py_3_10, all(Py_3_9, not(Py_LIMITED_API))))]
328 #[cfg_attr(PyPy, link_name = "PyPyType_GetModuleState")]
329 pub fn PyType_GetModuleState(arg1: *mut PyTypeObject) -> *mut c_void;
330
331 #[cfg(Py_3_11)]
332 #[cfg_attr(PyPy, link_name = "PyPyType_GetName")]
333 pub fn PyType_GetName(arg1: *mut PyTypeObject) -> *mut PyObject;
334
335 #[cfg(Py_3_11)]
336 #[cfg_attr(PyPy, link_name = "PyPyType_GetQualName")]
337 pub fn PyType_GetQualName(arg1: *mut PyTypeObject) -> *mut PyObject;
338
339 #[cfg(Py_3_13)]
340 #[cfg_attr(PyPy, link_name = "PyPyType_GetFullyQualifiedName")]
341 pub fn PyType_GetFullyQualifiedName(arg1: *mut PyTypeObject) -> *mut PyObject;
342
343 #[cfg(Py_3_13)]
344 #[cfg_attr(PyPy, link_name = "PyPyType_GetModuleName")]
345 pub fn PyType_GetModuleName(arg1: *mut PyTypeObject) -> *mut PyObject;
346
347 #[cfg(Py_3_12)]
348 #[cfg_attr(PyPy, link_name = "PyPyType_FromMetaclass")]
349 pub fn PyType_FromMetaclass(
350 metaclass: *mut PyTypeObject,
351 module: *mut PyObject,
352 spec: *mut PyType_Spec,
353 bases: *mut PyObject,
354 ) -> *mut PyObject;
355
356 #[cfg(Py_3_12)]
357 #[cfg_attr(PyPy, link_name = "PyPyObject_GetTypeData")]
358 pub fn PyObject_GetTypeData(obj: *mut PyObject, cls: *mut PyTypeObject) -> *mut c_void;
359
360 #[cfg(Py_3_12)]
361 #[cfg_attr(PyPy, link_name = "PyPyObject_GetTypeDataSize")]
362 pub fn PyObject_GetTypeDataSize(cls: *mut PyTypeObject) -> Py_ssize_t;
363
364 #[cfg_attr(PyPy, link_name = "PyPyType_IsSubtype")]
365 pub fn PyType_IsSubtype(a: *mut PyTypeObject, b: *mut PyTypeObject) -> c_int;
366}
367
368#[inline]
369pub unsafe fn PyObject_TypeCheck(ob: *mut PyObject, tp: *mut PyTypeObject) -> c_int {
370 (Py_IS_TYPE(ob, tp) != 0 || PyType_IsSubtype(Py_TYPE(ob), tp) != 0) as c_int
371}
372
373#[cfg_attr(windows, link(name = "pythonXY"))]
374extern "C" {
375 #[cfg_attr(PyPy, link_name = "PyPyType_Type")]
377 pub static mut PyType_Type: PyTypeObject;
378 #[cfg_attr(PyPy, link_name = "PyPyBaseObject_Type")]
380 pub static mut PyBaseObject_Type: PyTypeObject;
381 pub static mut PySuper_Type: PyTypeObject;
383}
384
385extern "C" {
386 pub fn PyType_GetFlags(arg1: *mut PyTypeObject) -> c_ulong;
387
388 #[cfg_attr(PyPy, link_name = "PyPyType_Ready")]
389 pub fn PyType_Ready(t: *mut PyTypeObject) -> c_int;
390 #[cfg_attr(PyPy, link_name = "PyPyType_GenericAlloc")]
391 pub fn PyType_GenericAlloc(t: *mut PyTypeObject, nitems: Py_ssize_t) -> *mut PyObject;
392 #[cfg_attr(PyPy, link_name = "PyPyType_GenericNew")]
393 pub fn PyType_GenericNew(
394 t: *mut PyTypeObject,
395 args: *mut PyObject,
396 kwds: *mut PyObject,
397 ) -> *mut PyObject;
398 pub fn PyType_ClearCache() -> c_uint;
399 #[cfg_attr(PyPy, link_name = "PyPyType_Modified")]
400 pub fn PyType_Modified(t: *mut PyTypeObject);
401
402 #[cfg_attr(PyPy, link_name = "PyPyObject_Repr")]
403 pub fn PyObject_Repr(o: *mut PyObject) -> *mut PyObject;
404 #[cfg_attr(PyPy, link_name = "PyPyObject_Str")]
405 pub fn PyObject_Str(o: *mut PyObject) -> *mut PyObject;
406 #[cfg_attr(PyPy, link_name = "PyPyObject_ASCII")]
407 pub fn PyObject_ASCII(arg1: *mut PyObject) -> *mut PyObject;
408 #[cfg_attr(PyPy, link_name = "PyPyObject_Bytes")]
409 pub fn PyObject_Bytes(arg1: *mut PyObject) -> *mut PyObject;
410 #[cfg_attr(PyPy, link_name = "PyPyObject_RichCompare")]
411 pub fn PyObject_RichCompare(
412 arg1: *mut PyObject,
413 arg2: *mut PyObject,
414 arg3: c_int,
415 ) -> *mut PyObject;
416 #[cfg_attr(PyPy, link_name = "PyPyObject_RichCompareBool")]
417 pub fn PyObject_RichCompareBool(arg1: *mut PyObject, arg2: *mut PyObject, arg3: c_int)
418 -> c_int;
419 #[cfg_attr(PyPy, link_name = "PyPyObject_GetAttrString")]
420 pub fn PyObject_GetAttrString(arg1: *mut PyObject, arg2: *const c_char) -> *mut PyObject;
421 #[cfg_attr(PyPy, link_name = "PyPyObject_SetAttrString")]
422 pub fn PyObject_SetAttrString(
423 arg1: *mut PyObject,
424 arg2: *const c_char,
425 arg3: *mut PyObject,
426 ) -> c_int;
427 #[cfg(any(Py_3_13, all(PyPy, not(Py_3_11))))] #[cfg_attr(PyPy, link_name = "PyPyObject_DelAttrString")]
429 pub fn PyObject_DelAttrString(arg1: *mut PyObject, arg2: *const c_char) -> c_int;
430 #[cfg_attr(PyPy, link_name = "PyPyObject_HasAttrString")]
431 pub fn PyObject_HasAttrString(arg1: *mut PyObject, arg2: *const c_char) -> c_int;
432 #[cfg_attr(PyPy, link_name = "PyPyObject_GetAttr")]
433 pub fn PyObject_GetAttr(arg1: *mut PyObject, arg2: *mut PyObject) -> *mut PyObject;
434 #[cfg(Py_3_13)]
435 #[cfg_attr(PyPy, link_name = "PyPyObject_GetOptionalAttr")]
436 pub fn PyObject_GetOptionalAttr(
437 arg1: *mut PyObject,
438 arg2: *mut PyObject,
439 arg3: *mut *mut PyObject,
440 ) -> c_int;
441 #[cfg(Py_3_13)]
442 #[cfg_attr(PyPy, link_name = "PyPyObject_GetOptionalAttrString")]
443 pub fn PyObject_GetOptionalAttrString(
444 arg1: *mut PyObject,
445 arg2: *const c_char,
446 arg3: *mut *mut PyObject,
447 ) -> c_int;
448 #[cfg_attr(PyPy, link_name = "PyPyObject_SetAttr")]
449 pub fn PyObject_SetAttr(arg1: *mut PyObject, arg2: *mut PyObject, arg3: *mut PyObject)
450 -> c_int;
451 #[cfg(any(Py_3_13, all(PyPy, not(Py_3_11))))] #[cfg_attr(PyPy, link_name = "PyPyObject_DelAttr")]
453 pub fn PyObject_DelAttr(arg1: *mut PyObject, arg2: *mut PyObject) -> c_int;
454 #[cfg_attr(PyPy, link_name = "PyPyObject_HasAttr")]
455 pub fn PyObject_HasAttr(arg1: *mut PyObject, arg2: *mut PyObject) -> c_int;
456 #[cfg(Py_3_13)]
457 #[cfg_attr(PyPy, link_name = "PyPyObject_HasAttrWithError")]
458 pub fn PyObject_HasAttrWithError(arg1: *mut PyObject, arg2: *mut PyObject) -> c_int;
459 #[cfg(Py_3_13)]
460 #[cfg_attr(PyPy, link_name = "PyPyObject_HasAttrStringWithError")]
461 pub fn PyObject_HasAttrStringWithError(arg1: *mut PyObject, arg2: *const c_char) -> c_int;
462 #[cfg_attr(PyPy, link_name = "PyPyObject_SelfIter")]
463 pub fn PyObject_SelfIter(arg1: *mut PyObject) -> *mut PyObject;
464 #[cfg_attr(PyPy, link_name = "PyPyObject_GenericGetAttr")]
465 pub fn PyObject_GenericGetAttr(arg1: *mut PyObject, arg2: *mut PyObject) -> *mut PyObject;
466 #[cfg_attr(PyPy, link_name = "PyPyObject_GenericSetAttr")]
467 pub fn PyObject_GenericSetAttr(
468 arg1: *mut PyObject,
469 arg2: *mut PyObject,
470 arg3: *mut PyObject,
471 ) -> c_int;
472 #[cfg(not(all(Py_LIMITED_API, not(Py_3_10))))]
473 #[cfg_attr(PyPy, link_name = "PyPyObject_GenericGetDict")]
474 pub fn PyObject_GenericGetDict(arg1: *mut PyObject, arg2: *mut c_void) -> *mut PyObject;
475 #[cfg_attr(PyPy, link_name = "PyPyObject_GenericSetDict")]
476 pub fn PyObject_GenericSetDict(
477 arg1: *mut PyObject,
478 arg2: *mut PyObject,
479 arg3: *mut c_void,
480 ) -> c_int;
481 #[cfg_attr(PyPy, link_name = "PyPyObject_Hash")]
482 pub fn PyObject_Hash(arg1: *mut PyObject) -> Py_hash_t;
483 #[cfg_attr(PyPy, link_name = "PyPyObject_HashNotImplemented")]
484 pub fn PyObject_HashNotImplemented(arg1: *mut PyObject) -> Py_hash_t;
485 #[cfg_attr(PyPy, link_name = "PyPyObject_IsTrue")]
486 pub fn PyObject_IsTrue(arg1: *mut PyObject) -> c_int;
487 #[cfg_attr(PyPy, link_name = "PyPyObject_Not")]
488 pub fn PyObject_Not(arg1: *mut PyObject) -> c_int;
489 #[cfg_attr(PyPy, link_name = "PyPyCallable_Check")]
490 pub fn PyCallable_Check(arg1: *mut PyObject) -> c_int;
491 #[cfg_attr(PyPy, link_name = "PyPyObject_ClearWeakRefs")]
492 pub fn PyObject_ClearWeakRefs(arg1: *mut PyObject);
493
494 #[cfg_attr(PyPy, link_name = "PyPyObject_Dir")]
495 pub fn PyObject_Dir(arg1: *mut PyObject) -> *mut PyObject;
496 pub fn Py_ReprEnter(arg1: *mut PyObject) -> c_int;
497 pub fn Py_ReprLeave(arg1: *mut PyObject);
498}
499
500pub const Py_PRINT_RAW: c_int = 1; #[cfg(all(Py_3_12, not(Py_LIMITED_API)))]
507pub const Py_TPFLAGS_MANAGED_WEAKREF: c_ulong = 1 << 3;
508
509#[cfg(all(Py_3_11, not(Py_LIMITED_API)))]
510pub const Py_TPFLAGS_MANAGED_DICT: c_ulong = 1 << 4;
511
512#[cfg(all(Py_3_10, not(Py_LIMITED_API)))]
513pub const Py_TPFLAGS_SEQUENCE: c_ulong = 1 << 5;
514
515#[cfg(all(Py_3_10, not(Py_LIMITED_API)))]
516pub const Py_TPFLAGS_MAPPING: c_ulong = 1 << 6;
517
518#[cfg(Py_3_10)]
519pub const Py_TPFLAGS_DISALLOW_INSTANTIATION: c_ulong = 1 << 7;
520
521#[cfg(Py_3_10)]
522pub const Py_TPFLAGS_IMMUTABLETYPE: c_ulong = 1 << 8;
523
524pub const Py_TPFLAGS_HEAPTYPE: c_ulong = 1 << 9;
526
527pub const Py_TPFLAGS_BASETYPE: c_ulong = 1 << 10;
529
530#[cfg(any(Py_3_12, all(Py_3_8, not(Py_LIMITED_API))))]
532pub const Py_TPFLAGS_HAVE_VECTORCALL: c_ulong = 1 << 11;
533pub const Py_TPFLAGS_READY: c_ulong = 1 << 12;
537
538pub const Py_TPFLAGS_READYING: c_ulong = 1 << 13;
540
541pub const Py_TPFLAGS_HAVE_GC: c_ulong = 1 << 14;
543
544const Py_TPFLAGS_HAVE_STACKLESS_EXTENSION: c_ulong = 0;
545
546#[cfg(Py_3_8)]
547pub const Py_TPFLAGS_METHOD_DESCRIPTOR: c_ulong = 1 << 17;
548
549pub const Py_TPFLAGS_VALID_VERSION_TAG: c_ulong = 1 << 19;
550
551pub const Py_TPFLAGS_IS_ABSTRACT: c_ulong = 1 << 20;
553
554#[cfg(Py_3_12)]
556pub const Py_TPFLAGS_ITEMS_AT_END: c_ulong = 1 << 23;
557
558pub const Py_TPFLAGS_LONG_SUBCLASS: c_ulong = 1 << 24;
560pub const Py_TPFLAGS_LIST_SUBCLASS: c_ulong = 1 << 25;
561pub const Py_TPFLAGS_TUPLE_SUBCLASS: c_ulong = 1 << 26;
562pub const Py_TPFLAGS_BYTES_SUBCLASS: c_ulong = 1 << 27;
563pub const Py_TPFLAGS_UNICODE_SUBCLASS: c_ulong = 1 << 28;
564pub const Py_TPFLAGS_DICT_SUBCLASS: c_ulong = 1 << 29;
565pub const Py_TPFLAGS_BASE_EXC_SUBCLASS: c_ulong = 1 << 30;
566pub const Py_TPFLAGS_TYPE_SUBCLASS: c_ulong = 1 << 31;
567
568pub const Py_TPFLAGS_DEFAULT: c_ulong = if cfg!(Py_3_10) {
569 Py_TPFLAGS_HAVE_STACKLESS_EXTENSION
570} else {
571 Py_TPFLAGS_HAVE_STACKLESS_EXTENSION | Py_TPFLAGS_HAVE_VERSION_TAG
572};
573
574pub const Py_TPFLAGS_HAVE_FINALIZE: c_ulong = 1;
575pub const Py_TPFLAGS_HAVE_VERSION_TAG: c_ulong = 1 << 18;
576
577#[cfg(Py_3_13)]
578pub const Py_CONSTANT_NONE: c_uint = 0;
579#[cfg(Py_3_13)]
580pub const Py_CONSTANT_FALSE: c_uint = 1;
581#[cfg(Py_3_13)]
582pub const Py_CONSTANT_TRUE: c_uint = 2;
583#[cfg(Py_3_13)]
584pub const Py_CONSTANT_ELLIPSIS: c_uint = 3;
585#[cfg(Py_3_13)]
586pub const Py_CONSTANT_NOT_IMPLEMENTED: c_uint = 4;
587#[cfg(Py_3_13)]
588pub const Py_CONSTANT_ZERO: c_uint = 5;
589#[cfg(Py_3_13)]
590pub const Py_CONSTANT_ONE: c_uint = 6;
591#[cfg(Py_3_13)]
592pub const Py_CONSTANT_EMPTY_STR: c_uint = 7;
593#[cfg(Py_3_13)]
594pub const Py_CONSTANT_EMPTY_BYTES: c_uint = 8;
595#[cfg(Py_3_13)]
596pub const Py_CONSTANT_EMPTY_TUPLE: c_uint = 9;
597
598extern "C" {
599 #[cfg(Py_3_13)]
600 #[cfg_attr(PyPy, link_name = "PyPy_GetConstant")]
601 pub fn Py_GetConstant(constant_id: c_uint) -> *mut PyObject;
602 #[cfg(Py_3_13)]
603 #[cfg_attr(PyPy, link_name = "PyPy_GetConstantBorrowed")]
604 pub fn Py_GetConstantBorrowed(constant_id: c_uint) -> *mut PyObject;
605}
606
607#[cfg_attr(windows, link(name = "pythonXY"))]
608extern "C" {
609 #[cfg(all(not(GraalPy), not(all(Py_3_13, Py_LIMITED_API))))]
610 #[cfg_attr(PyPy, link_name = "_PyPy_NoneStruct")]
611 static mut _Py_NoneStruct: PyObject;
612
613 #[cfg(GraalPy)]
614 static mut _Py_NoneStructReference: *mut PyObject;
615}
616
617#[inline]
618pub unsafe fn Py_None() -> *mut PyObject {
619 #[cfg(all(not(GraalPy), all(Py_3_13, Py_LIMITED_API)))]
620 return Py_GetConstantBorrowed(Py_CONSTANT_NONE);
621
622 #[cfg(all(not(GraalPy), not(all(Py_3_13, Py_LIMITED_API))))]
623 return ptr::addr_of_mut!(_Py_NoneStruct);
624
625 #[cfg(GraalPy)]
626 return _Py_NoneStructReference;
627}
628
629#[inline]
630pub unsafe fn Py_IsNone(x: *mut PyObject) -> c_int {
631 Py_Is(x, Py_None())
632}
633
634#[cfg_attr(windows, link(name = "pythonXY"))]
637extern "C" {
638 #[cfg(all(not(GraalPy), not(all(Py_3_13, Py_LIMITED_API))))]
639 #[cfg_attr(PyPy, link_name = "_PyPy_NotImplementedStruct")]
640 static mut _Py_NotImplementedStruct: PyObject;
641
642 #[cfg(GraalPy)]
643 static mut _Py_NotImplementedStructReference: *mut PyObject;
644}
645
646#[inline]
647pub unsafe fn Py_NotImplemented() -> *mut PyObject {
648 #[cfg(all(not(GraalPy), all(Py_3_13, Py_LIMITED_API)))]
649 return Py_GetConstantBorrowed(Py_CONSTANT_NOT_IMPLEMENTED);
650
651 #[cfg(all(not(GraalPy), not(all(Py_3_13, Py_LIMITED_API))))]
652 return ptr::addr_of_mut!(_Py_NotImplementedStruct);
653
654 #[cfg(GraalPy)]
655 return _Py_NotImplementedStructReference;
656}
657
658pub const Py_LT: c_int = 0;
662pub const Py_LE: c_int = 1;
663pub const Py_EQ: c_int = 2;
664pub const Py_NE: c_int = 3;
665pub const Py_GT: c_int = 4;
666pub const Py_GE: c_int = 5;
667
668#[cfg(Py_3_10)]
669#[repr(C)]
670#[derive(Copy, Clone, Debug, PartialEq, Eq)]
671pub enum PySendResult {
672 PYGEN_RETURN = 0,
673 PYGEN_ERROR = -1,
674 PYGEN_NEXT = 1,
675}
676
677#[inline]
680pub unsafe fn PyType_HasFeature(ty: *mut PyTypeObject, feature: c_ulong) -> c_int {
681 #[cfg(Py_LIMITED_API)]
682 let flags = PyType_GetFlags(ty);
683
684 #[cfg(all(not(Py_LIMITED_API), Py_GIL_DISABLED))]
685 let flags = (*ty).tp_flags.load(std::sync::atomic::Ordering::Relaxed);
686
687 #[cfg(all(not(Py_LIMITED_API), not(Py_GIL_DISABLED)))]
688 let flags = (*ty).tp_flags;
689
690 ((flags & feature) != 0) as c_int
691}
692
693#[inline]
694pub unsafe fn PyType_FastSubclass(t: *mut PyTypeObject, f: c_ulong) -> c_int {
695 PyType_HasFeature(t, f)
696}
697
698#[inline]
699pub unsafe fn PyType_Check(op: *mut PyObject) -> c_int {
700 PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_TYPE_SUBCLASS)
701}
702
703#[inline]
706pub unsafe fn PyType_CheckExact(op: *mut PyObject) -> c_int {
707 Py_IS_TYPE(op, ptr::addr_of_mut!(PyType_Type))
708}
709
710extern "C" {
711 #[cfg(any(Py_3_13, all(Py_3_11, not(Py_LIMITED_API))))]
712 #[cfg_attr(PyPy, link_name = "PyPyType_GetModuleByDef")]
713 pub fn PyType_GetModuleByDef(
714 arg1: *mut crate::PyTypeObject,
715 arg2: *mut crate::PyModuleDef,
716 ) -> *mut PyObject;
717
718 #[cfg(Py_3_14)]
719 pub fn PyType_Freeze(tp: *mut crate::PyTypeObject) -> c_int;
720}