| 1 | use crate::pyport::{Py_hash_t, Py_ssize_t}; |
| 2 | #[cfg (Py_GIL_DISABLED)] |
| 3 | use crate::PyMutex; |
| 4 | #[cfg (Py_GIL_DISABLED)] |
| 5 | use std::marker::PhantomPinned; |
| 6 | use std::mem; |
| 7 | use std::os::raw::{c_char, c_int, c_uint, c_ulong, c_void}; |
| 8 | use std::ptr; |
| 9 | #[cfg (Py_GIL_DISABLED)] |
| 10 | use std::sync::atomic::{AtomicIsize, AtomicU32, AtomicU8, Ordering::Relaxed}; |
| 11 | |
| 12 | #[cfg (Py_LIMITED_API)] |
| 13 | opaque_struct!(PyTypeObject); |
| 14 | |
| 15 | #[cfg (not(Py_LIMITED_API))] |
| 16 | pub use crate::cpython::object::PyTypeObject; |
| 17 | |
| 18 | #[cfg (Py_3_12)] |
| 19 | const _Py_IMMORTAL_REFCNT: Py_ssize_t = { |
| 20 | if cfg!(target_pointer_width = "64" ) { |
| 21 | c_uint::MAX as Py_ssize_t |
| 22 | } else { |
| 23 | // for 32-bit systems, use the lower 30 bits (see comment in CPython's object.h) |
| 24 | (c_uint::MAX >> 2) as Py_ssize_t |
| 25 | } |
| 26 | }; |
| 27 | |
| 28 | #[cfg (Py_GIL_DISABLED)] |
| 29 | const _Py_IMMORTAL_REFCNT_LOCAL: u32 = u32::MAX; |
| 30 | |
| 31 | #[allow (clippy::declare_interior_mutable_const)] |
| 32 | pub const PyObject_HEAD_INIT: PyObject = PyObject { |
| 33 | #[cfg (py_sys_config = "Py_TRACE_REFS" )] |
| 34 | _ob_next: std::ptr::null_mut(), |
| 35 | #[cfg (py_sys_config = "Py_TRACE_REFS" )] |
| 36 | _ob_prev: std::ptr::null_mut(), |
| 37 | #[cfg (Py_GIL_DISABLED)] |
| 38 | ob_tid: 0, |
| 39 | #[cfg (Py_GIL_DISABLED)] |
| 40 | _padding: 0, |
| 41 | #[cfg (Py_GIL_DISABLED)] |
| 42 | ob_mutex: PyMutex { |
| 43 | _bits: AtomicU8::new(0), |
| 44 | _pin: PhantomPinned, |
| 45 | }, |
| 46 | #[cfg (Py_GIL_DISABLED)] |
| 47 | ob_gc_bits: 0, |
| 48 | #[cfg (Py_GIL_DISABLED)] |
| 49 | ob_ref_local: AtomicU32::new(_Py_IMMORTAL_REFCNT_LOCAL), |
| 50 | #[cfg (Py_GIL_DISABLED)] |
| 51 | ob_ref_shared: AtomicIsize::new(0), |
| 52 | #[cfg (all(not(Py_GIL_DISABLED), Py_3_12))] |
| 53 | ob_refcnt: PyObjectObRefcnt { ob_refcnt: 1 }, |
| 54 | #[cfg (not(Py_3_12))] |
| 55 | ob_refcnt: 1, |
| 56 | #[cfg (PyPy)] |
| 57 | ob_pypy_link: 0, |
| 58 | ob_type: std::ptr::null_mut(), |
| 59 | }; |
| 60 | |
| 61 | // skipped PyObject_VAR_HEAD |
| 62 | // skipped Py_INVALID_SIZE |
| 63 | |
| 64 | // skipped private _Py_UNOWNED_TID |
| 65 | |
| 66 | #[cfg (Py_GIL_DISABLED)] |
| 67 | const _Py_REF_SHARED_SHIFT: isize = 2; |
| 68 | // skipped private _Py_REF_SHARED_FLAG_MASK |
| 69 | |
| 70 | // skipped private _Py_REF_SHARED_INIT |
| 71 | // skipped private _Py_REF_MAYBE_WEAKREF |
| 72 | // skipped private _Py_REF_QUEUED |
| 73 | // skipped private _Py_REF_MERGED |
| 74 | |
| 75 | // skipped private _Py_REF_SHARED |
| 76 | |
| 77 | #[repr (C)] |
| 78 | #[derive (Copy, Clone)] |
| 79 | #[cfg (all(Py_3_12, not(Py_GIL_DISABLED)))] |
| 80 | /// This union is anonymous in CPython, so the name was given by PyO3 because |
| 81 | /// Rust unions need a name. |
| 82 | pub union PyObjectObRefcnt { |
| 83 | pub ob_refcnt: Py_ssize_t, |
| 84 | #[cfg (target_pointer_width = "64" )] |
| 85 | pub ob_refcnt_split: [crate::PY_UINT32_T; 2], |
| 86 | } |
| 87 | |
| 88 | #[cfg (all(Py_3_12, not(Py_GIL_DISABLED)))] |
| 89 | impl std::fmt::Debug for PyObjectObRefcnt { |
| 90 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { |
| 91 | write!(f, "{}" , unsafe { self.ob_refcnt }) |
| 92 | } |
| 93 | } |
| 94 | |
| 95 | #[cfg (all(not(Py_3_12), not(Py_GIL_DISABLED)))] |
| 96 | pub type PyObjectObRefcnt = Py_ssize_t; |
| 97 | |
| 98 | #[repr (C)] |
| 99 | #[derive (Debug)] |
| 100 | pub struct PyObject { |
| 101 | #[cfg (py_sys_config = "Py_TRACE_REFS" )] |
| 102 | pub _ob_next: *mut PyObject, |
| 103 | #[cfg (py_sys_config = "Py_TRACE_REFS" )] |
| 104 | pub _ob_prev: *mut PyObject, |
| 105 | #[cfg (Py_GIL_DISABLED)] |
| 106 | pub ob_tid: libc::uintptr_t, |
| 107 | #[cfg (Py_GIL_DISABLED)] |
| 108 | pub _padding: u16, |
| 109 | #[cfg (Py_GIL_DISABLED)] |
| 110 | pub ob_mutex: PyMutex, // per-object lock |
| 111 | #[cfg (Py_GIL_DISABLED)] |
| 112 | pub ob_gc_bits: u8, // gc-related state |
| 113 | #[cfg (Py_GIL_DISABLED)] |
| 114 | pub ob_ref_local: AtomicU32, // local reference count |
| 115 | #[cfg (Py_GIL_DISABLED)] |
| 116 | pub ob_ref_shared: AtomicIsize, // shared reference count |
| 117 | #[cfg (not(Py_GIL_DISABLED))] |
| 118 | pub ob_refcnt: PyObjectObRefcnt, |
| 119 | #[cfg (PyPy)] |
| 120 | pub ob_pypy_link: Py_ssize_t, |
| 121 | pub ob_type: *mut PyTypeObject, |
| 122 | } |
| 123 | |
| 124 | // skipped private _PyObject_CAST |
| 125 | |
| 126 | #[repr (C)] |
| 127 | #[derive (Debug)] |
| 128 | pub struct PyVarObject { |
| 129 | pub ob_base: PyObject, |
| 130 | #[cfg (not(GraalPy))] |
| 131 | pub ob_size: Py_ssize_t, |
| 132 | // On GraalPy the field is physically there, but not always populated. We hide it to prevent accidental misuse |
| 133 | #[cfg (GraalPy)] |
| 134 | pub _ob_size_graalpy: Py_ssize_t, |
| 135 | } |
| 136 | |
| 137 | // skipped private _PyVarObject_CAST |
| 138 | |
| 139 | #[inline ] |
| 140 | #[cfg (not(all(PyPy, Py_3_10)))] |
| 141 | #[cfg_attr (docsrs, doc(cfg(all())))] |
| 142 | pub unsafe fn Py_Is(x: *mut PyObject, y: *mut PyObject) -> c_int { |
| 143 | (x == y).into() |
| 144 | } |
| 145 | |
| 146 | #[cfg (all(PyPy, Py_3_10))] |
| 147 | #[cfg_attr (docsrs, doc(cfg(all())))] |
| 148 | extern "C" { |
| 149 | #[cfg_attr (PyPy, link_name = "PyPy_Is" )] |
| 150 | pub fn Py_Is(x: *mut PyObject, y: *mut PyObject) -> c_int; |
| 151 | } |
| 152 | |
| 153 | // skipped private _Py_GetThreadLocal_Addr |
| 154 | |
| 155 | // skipped private _Py_ThreadId |
| 156 | |
| 157 | // skipped private _Py_IsOwnedByCurrentThread |
| 158 | |
| 159 | #[inline ] |
| 160 | pub unsafe fn Py_REFCNT(ob: *mut PyObject) -> Py_ssize_t { |
| 161 | #[cfg (Py_GIL_DISABLED)] |
| 162 | { |
| 163 | let local = (*ob).ob_ref_local.load(Relaxed); |
| 164 | if local == _Py_IMMORTAL_REFCNT_LOCAL { |
| 165 | return _Py_IMMORTAL_REFCNT; |
| 166 | } |
| 167 | let shared = (*ob).ob_ref_shared.load(Relaxed); |
| 168 | local as Py_ssize_t + Py_ssize_t::from(shared >> _Py_REF_SHARED_SHIFT) |
| 169 | } |
| 170 | |
| 171 | #[cfg (all(not(Py_GIL_DISABLED), Py_3_12))] |
| 172 | { |
| 173 | (*ob).ob_refcnt.ob_refcnt |
| 174 | } |
| 175 | |
| 176 | #[cfg (all(not(Py_GIL_DISABLED), not(Py_3_12), not(GraalPy)))] |
| 177 | { |
| 178 | (*ob).ob_refcnt |
| 179 | } |
| 180 | |
| 181 | #[cfg (all(not(Py_GIL_DISABLED), not(Py_3_12), GraalPy))] |
| 182 | { |
| 183 | _Py_REFCNT(ob) |
| 184 | } |
| 185 | } |
| 186 | |
| 187 | #[inline ] |
| 188 | pub unsafe fn Py_TYPE(ob: *mut PyObject) -> *mut PyTypeObject { |
| 189 | #[cfg (not(GraalPy))] |
| 190 | return (*ob).ob_type; |
| 191 | #[cfg (GraalPy)] |
| 192 | return _Py_TYPE(ob); |
| 193 | } |
| 194 | |
| 195 | #[cfg_attr (windows, link(name = "pythonXY" ))] |
| 196 | unsafeextern "C" { |
| 197 | #[cfg_attr (PyPy, link_name = "PyPyLong_Type" )] |
| 198 | pub unsafestatic mut PyLong_Type: PyTypeObject; |
| 199 | #[cfg_attr (PyPy, link_name = "PyPyBool_Type" )] |
| 200 | pub unsafestatic mut PyBool_Type: PyTypeObject; |
| 201 | } |
| 202 | |
| 203 | #[inline ] |
| 204 | pub unsafe fn Py_SIZE(ob: *mut PyObject) -> Py_ssize_t { |
| 205 | #[cfg (not(GraalPy))] |
| 206 | { |
| 207 | debug_assert_ne!((*ob).ob_type, std::ptr::addr_of_mut!(crate::PyLong_Type)); |
| 208 | debug_assert_ne!((*ob).ob_type, std::ptr::addr_of_mut!(crate::PyBool_Type)); |
| 209 | (*ob.cast::<PyVarObject>()).ob_size |
| 210 | } |
| 211 | #[cfg (GraalPy)] |
| 212 | _Py_SIZE(ob) |
| 213 | } |
| 214 | |
| 215 | #[inline (always)] |
| 216 | #[cfg (all(Py_3_12, not(Py_GIL_DISABLED)))] |
| 217 | unsafe fn _Py_IsImmortal(op: *mut PyObject) -> c_int { |
| 218 | #[cfg (target_pointer_width = "64" )] |
| 219 | { |
| 220 | (((*op).ob_refcnt.ob_refcnt as crate::PY_INT32_T) < 0) as c_int |
| 221 | } |
| 222 | |
| 223 | #[cfg (target_pointer_width = "32" )] |
| 224 | { |
| 225 | ((*op).ob_refcnt.ob_refcnt == _Py_IMMORTAL_REFCNT) as c_int |
| 226 | } |
| 227 | } |
| 228 | |
| 229 | #[inline ] |
| 230 | pub unsafe fn Py_IS_TYPE(ob: *mut PyObject, tp: *mut PyTypeObject) -> c_int { |
| 231 | (Py_TYPE(ob) == tp) as c_int |
| 232 | } |
| 233 | |
| 234 | // skipped _Py_SetRefCnt |
| 235 | |
| 236 | // skipped Py_SET_REFCNT |
| 237 | |
| 238 | // skipped Py_SET_TYPE |
| 239 | |
| 240 | // skipped Py_SET_SIZE |
| 241 | |
| 242 | pub type unaryfunc = unsafe extern "C" fn(*mut PyObject) -> *mut PyObject; |
| 243 | pub type binaryfunc = unsafe extern "C" fn(*mut PyObject, *mut PyObject) -> *mut PyObject; |
| 244 | pub type ternaryfunc = |
| 245 | unsafe extern "C" fn(*mut PyObject, *mut PyObject, *mut PyObject) -> *mut PyObject; |
| 246 | pub type inquiry = unsafe extern "C" fn(*mut PyObject) -> c_int; |
| 247 | pub type lenfunc = unsafe extern "C" fn(*mut PyObject) -> Py_ssize_t; |
| 248 | pub type ssizeargfunc = unsafe extern "C" fn(*mut PyObject, Py_ssize_t) -> *mut PyObject; |
| 249 | pub type ssizessizeargfunc = |
| 250 | unsafe extern "C" fn(*mut PyObject, Py_ssize_t, Py_ssize_t) -> *mut PyObject; |
| 251 | pub type ssizeobjargproc = unsafe extern "C" fn(*mut PyObject, Py_ssize_t, *mut PyObject) -> c_int; |
| 252 | pub type ssizessizeobjargproc = |
| 253 | unsafe extern "C" fn(*mut PyObject, Py_ssize_t, Py_ssize_t, arg4: *mut PyObject) -> c_int; |
| 254 | pub type objobjargproc = unsafe extern "C" fn(*mut PyObject, *mut PyObject, *mut PyObject) -> c_int; |
| 255 | |
| 256 | pub type objobjproc = unsafe extern "C" fn(*mut PyObject, *mut PyObject) -> c_int; |
| 257 | pub type visitproc = unsafe extern "C" fn(object: *mut PyObject, arg: *mut c_void) -> c_int; |
| 258 | pub type traverseproc = |
| 259 | unsafe extern "C" fn(slf: *mut PyObject, visit: visitproc, arg: *mut c_void) -> c_int; |
| 260 | |
| 261 | pub type freefunc = unsafe extern "C" fn(*mut c_void); |
| 262 | pub type destructor = unsafe extern "C" fn(*mut PyObject); |
| 263 | pub type getattrfunc = unsafe extern "C" fn(*mut PyObject, *mut c_char) -> *mut PyObject; |
| 264 | pub type getattrofunc = unsafe extern "C" fn(*mut PyObject, *mut PyObject) -> *mut PyObject; |
| 265 | pub type setattrfunc = unsafe extern "C" fn(*mut PyObject, *mut c_char, *mut PyObject) -> c_int; |
| 266 | pub type setattrofunc = unsafe extern "C" fn(*mut PyObject, *mut PyObject, *mut PyObject) -> c_int; |
| 267 | pub type reprfunc = unsafe extern "C" fn(*mut PyObject) -> *mut PyObject; |
| 268 | pub type hashfunc = unsafe extern "C" fn(*mut PyObject) -> Py_hash_t; |
| 269 | pub type richcmpfunc = unsafe extern "C" fn(*mut PyObject, *mut PyObject, c_int) -> *mut PyObject; |
| 270 | pub type getiterfunc = unsafe extern "C" fn(*mut PyObject) -> *mut PyObject; |
| 271 | pub type iternextfunc = unsafe extern "C" fn(*mut PyObject) -> *mut PyObject; |
| 272 | pub type descrgetfunc = |
| 273 | unsafe extern "C" fn(*mut PyObject, *mut PyObject, *mut PyObject) -> *mut PyObject; |
| 274 | pub type descrsetfunc = unsafe extern "C" fn(*mut PyObject, *mut PyObject, *mut PyObject) -> c_int; |
| 275 | pub type initproc = unsafe extern "C" fn(*mut PyObject, *mut PyObject, *mut PyObject) -> c_int; |
| 276 | pub type newfunc = |
| 277 | unsafe extern "C" fn(*mut PyTypeObject, *mut PyObject, *mut PyObject) -> *mut PyObject; |
| 278 | pub type allocfunc = unsafe extern "C" fn(*mut PyTypeObject, Py_ssize_t) -> *mut PyObject; |
| 279 | |
| 280 | #[cfg (Py_3_8)] |
| 281 | pub type vectorcallfunc = unsafe extern "C" fn( |
| 282 | callable: *mut PyObject, |
| 283 | args: *const *mut PyObject, |
| 284 | nargsf: libc::size_t, |
| 285 | kwnames: *mut PyObject, |
| 286 | ) -> *mut PyObject; |
| 287 | |
| 288 | #[repr (C)] |
| 289 | #[derive (Copy, Clone)] |
| 290 | pub struct PyType_Slot { |
| 291 | pub slot: c_int, |
| 292 | pub pfunc: *mut c_void, |
| 293 | } |
| 294 | |
| 295 | impl Default for PyType_Slot { |
| 296 | fn default() -> PyType_Slot { |
| 297 | unsafe { mem::zeroed() } |
| 298 | } |
| 299 | } |
| 300 | |
| 301 | #[repr (C)] |
| 302 | #[derive (Copy, Clone)] |
| 303 | pub struct PyType_Spec { |
| 304 | pub name: *const c_char, |
| 305 | pub basicsize: c_int, |
| 306 | pub itemsize: c_int, |
| 307 | pub flags: c_uint, |
| 308 | pub slots: *mut PyType_Slot, |
| 309 | } |
| 310 | |
| 311 | impl Default for PyType_Spec { |
| 312 | fn default() -> PyType_Spec { |
| 313 | unsafe { mem::zeroed() } |
| 314 | } |
| 315 | } |
| 316 | |
| 317 | unsafeextern "C" { |
| 318 | #[cfg_attr (PyPy, link_name = "PyPyType_FromSpec" )] |
| 319 | pub unsafefn PyType_FromSpec(arg1: *mut PyType_Spec) -> *mut PyObject; |
| 320 | |
| 321 | #[cfg_attr (PyPy, link_name = "PyPyType_FromSpecWithBases" )] |
| 322 | pub unsafefn PyType_FromSpecWithBases(arg1: *mut PyType_Spec, arg2: *mut PyObject) -> *mut PyObject; |
| 323 | |
| 324 | #[cfg_attr (PyPy, link_name = "PyPyType_GetSlot" )] |
| 325 | pub unsafefn PyType_GetSlot(arg1: *mut PyTypeObject, arg2: c_int) -> *mut c_void; |
| 326 | |
| 327 | #[cfg (any(Py_3_10, all(Py_3_9, not(Py_LIMITED_API))))] |
| 328 | #[cfg_attr (PyPy, link_name = "PyPyType_FromModuleAndSpec" )] |
| 329 | pub unsafefn PyType_FromModuleAndSpec( |
| 330 | module: *mut PyObject, |
| 331 | spec: *mut PyType_Spec, |
| 332 | bases: *mut PyObject, |
| 333 | ) -> *mut PyObject; |
| 334 | |
| 335 | #[cfg (any(Py_3_10, all(Py_3_9, not(Py_LIMITED_API))))] |
| 336 | #[cfg_attr (PyPy, link_name = "PyPyType_GetModule" )] |
| 337 | pub unsafefn PyType_GetModule(arg1: *mut PyTypeObject) -> *mut PyObject; |
| 338 | |
| 339 | #[cfg (any(Py_3_10, all(Py_3_9, not(Py_LIMITED_API))))] |
| 340 | #[cfg_attr (PyPy, link_name = "PyPyType_GetModuleState" )] |
| 341 | pub unsafefn PyType_GetModuleState(arg1: *mut PyTypeObject) -> *mut c_void; |
| 342 | |
| 343 | #[cfg (Py_3_11)] |
| 344 | #[cfg_attr (PyPy, link_name = "PyPyType_GetName" )] |
| 345 | pub fn PyType_GetName(arg1: *mut PyTypeObject) -> *mut PyObject; |
| 346 | |
| 347 | #[cfg (Py_3_11)] |
| 348 | #[cfg_attr (PyPy, link_name = "PyPyType_GetQualName" )] |
| 349 | pub fn PyType_GetQualName(arg1: *mut PyTypeObject) -> *mut PyObject; |
| 350 | |
| 351 | #[cfg (Py_3_13)] |
| 352 | #[cfg_attr (PyPy, link_name = "PyPyType_GetFullyQualifiedName" )] |
| 353 | pub fn PyType_GetFullyQualifiedName(arg1: *mut PyTypeObject) -> *mut PyObject; |
| 354 | |
| 355 | #[cfg (Py_3_13)] |
| 356 | #[cfg_attr (PyPy, link_name = "PyPyType_GetModuleName" )] |
| 357 | pub fn PyType_GetModuleName(arg1: *mut PyTypeObject) -> *mut PyObject; |
| 358 | |
| 359 | #[cfg (Py_3_12)] |
| 360 | #[cfg_attr (PyPy, link_name = "PyPyType_FromMetaclass" )] |
| 361 | pub fn PyType_FromMetaclass( |
| 362 | metaclass: *mut PyTypeObject, |
| 363 | module: *mut PyObject, |
| 364 | spec: *mut PyType_Spec, |
| 365 | bases: *mut PyObject, |
| 366 | ) -> *mut PyObject; |
| 367 | |
| 368 | #[cfg (Py_3_12)] |
| 369 | #[cfg_attr (PyPy, link_name = "PyPyObject_GetTypeData" )] |
| 370 | pub fn PyObject_GetTypeData(obj: *mut PyObject, cls: *mut PyTypeObject) -> *mut c_void; |
| 371 | |
| 372 | #[cfg (Py_3_12)] |
| 373 | #[cfg_attr (PyPy, link_name = "PyPyObject_GetTypeDataSize" )] |
| 374 | pub fn PyObject_GetTypeDataSize(cls: *mut PyTypeObject) -> Py_ssize_t; |
| 375 | |
| 376 | #[cfg_attr (PyPy, link_name = "PyPyType_IsSubtype" )] |
| 377 | pub unsafefn PyType_IsSubtype(a: *mut PyTypeObject, b: *mut PyTypeObject) -> c_int; |
| 378 | } |
| 379 | |
| 380 | #[inline ] |
| 381 | pub unsafe fn PyObject_TypeCheck(ob: *mut PyObject, tp: *mut PyTypeObject) -> c_int { |
| 382 | (Py_IS_TYPE(ob, tp) != 0 || PyType_IsSubtype(a:Py_TYPE(ob), b:tp) != 0) as c_int |
| 383 | } |
| 384 | |
| 385 | #[cfg_attr (windows, link(name = "pythonXY" ))] |
| 386 | unsafeextern "C" { |
| 387 | /// built-in 'type' |
| 388 | #[cfg_attr (PyPy, link_name = "PyPyType_Type" )] |
| 389 | pub unsafestatic mut PyType_Type: PyTypeObject; |
| 390 | /// built-in 'object' |
| 391 | #[cfg_attr (PyPy, link_name = "PyPyBaseObject_Type" )] |
| 392 | pub unsafestatic mut PyBaseObject_Type: PyTypeObject; |
| 393 | /// built-in 'super' |
| 394 | pub unsafestatic mut PySuper_Type: PyTypeObject; |
| 395 | } |
| 396 | |
| 397 | unsafeextern "C" { |
| 398 | pub unsafefn PyType_GetFlags(arg1: *mut PyTypeObject) -> c_ulong; |
| 399 | |
| 400 | #[cfg_attr (PyPy, link_name = "PyPyType_Ready" )] |
| 401 | pub unsafefn PyType_Ready(t: *mut PyTypeObject) -> c_int; |
| 402 | #[cfg_attr (PyPy, link_name = "PyPyType_GenericAlloc" )] |
| 403 | pub unsafefn PyType_GenericAlloc(t: *mut PyTypeObject, nitems: Py_ssize_t) -> *mut PyObject; |
| 404 | #[cfg_attr (PyPy, link_name = "PyPyType_GenericNew" )] |
| 405 | pub unsafefn PyType_GenericNew( |
| 406 | t: *mut PyTypeObject, |
| 407 | args: *mut PyObject, |
| 408 | kwds: *mut PyObject, |
| 409 | ) -> *mut PyObject; |
| 410 | pub unsafefn PyType_ClearCache() -> c_uint; |
| 411 | #[cfg_attr (PyPy, link_name = "PyPyType_Modified" )] |
| 412 | pub unsafefn PyType_Modified(t: *mut PyTypeObject); |
| 413 | |
| 414 | #[cfg_attr (PyPy, link_name = "PyPyObject_Repr" )] |
| 415 | pub unsafefn PyObject_Repr(o: *mut PyObject) -> *mut PyObject; |
| 416 | #[cfg_attr (PyPy, link_name = "PyPyObject_Str" )] |
| 417 | pub unsafefn PyObject_Str(o: *mut PyObject) -> *mut PyObject; |
| 418 | #[cfg_attr (PyPy, link_name = "PyPyObject_ASCII" )] |
| 419 | pub unsafefn PyObject_ASCII(arg1: *mut PyObject) -> *mut PyObject; |
| 420 | #[cfg_attr (PyPy, link_name = "PyPyObject_Bytes" )] |
| 421 | pub unsafefn PyObject_Bytes(arg1: *mut PyObject) -> *mut PyObject; |
| 422 | #[cfg_attr (PyPy, link_name = "PyPyObject_RichCompare" )] |
| 423 | pub unsafefn PyObject_RichCompare( |
| 424 | arg1: *mut PyObject, |
| 425 | arg2: *mut PyObject, |
| 426 | arg3: c_int, |
| 427 | ) -> *mut PyObject; |
| 428 | #[cfg_attr (PyPy, link_name = "PyPyObject_RichCompareBool" )] |
| 429 | pub unsafefn PyObject_RichCompareBool(arg1: *mut PyObject, arg2: *mut PyObject, arg3: c_int) |
| 430 | -> c_int; |
| 431 | #[cfg_attr (PyPy, link_name = "PyPyObject_GetAttrString" )] |
| 432 | pub unsafefn PyObject_GetAttrString(arg1: *mut PyObject, arg2: *const c_char) -> *mut PyObject; |
| 433 | #[cfg_attr (PyPy, link_name = "PyPyObject_SetAttrString" )] |
| 434 | pub unsafefn PyObject_SetAttrString( |
| 435 | arg1: *mut PyObject, |
| 436 | arg2: *const c_char, |
| 437 | arg3: *mut PyObject, |
| 438 | ) -> c_int; |
| 439 | #[cfg (any(Py_3_13, all(PyPy, not(Py_3_11))))] // CPython defined in 3.12 as an inline function in abstract.h |
| 440 | #[cfg_attr (PyPy, link_name = "PyPyObject_DelAttrString" )] |
| 441 | pub fn PyObject_DelAttrString(arg1: *mut PyObject, arg2: *const c_char) -> c_int; |
| 442 | #[cfg_attr (PyPy, link_name = "PyPyObject_HasAttrString" )] |
| 443 | pub unsafefn PyObject_HasAttrString(arg1: *mut PyObject, arg2: *const c_char) -> c_int; |
| 444 | #[cfg_attr (PyPy, link_name = "PyPyObject_GetAttr" )] |
| 445 | pub unsafefn PyObject_GetAttr(arg1: *mut PyObject, arg2: *mut PyObject) -> *mut PyObject; |
| 446 | #[cfg (Py_3_13)] |
| 447 | #[cfg_attr (PyPy, link_name = "PyPyObject_GetOptionalAttr" )] |
| 448 | pub fn PyObject_GetOptionalAttr( |
| 449 | arg1: *mut PyObject, |
| 450 | arg2: *mut PyObject, |
| 451 | arg3: *mut *mut PyObject, |
| 452 | ) -> c_int; |
| 453 | #[cfg (Py_3_13)] |
| 454 | #[cfg_attr (PyPy, link_name = "PyPyObject_GetOptionalAttrString" )] |
| 455 | pub fn PyObject_GetOptionalAttrString( |
| 456 | arg1: *mut PyObject, |
| 457 | arg2: *const c_char, |
| 458 | arg3: *mut *mut PyObject, |
| 459 | ) -> c_int; |
| 460 | #[cfg_attr (PyPy, link_name = "PyPyObject_SetAttr" )] |
| 461 | pub unsafefn PyObject_SetAttr(arg1: *mut PyObject, arg2: *mut PyObject, arg3: *mut PyObject) |
| 462 | -> c_int; |
| 463 | #[cfg (any(Py_3_13, all(PyPy, not(Py_3_11))))] // CPython defined in 3.12 as an inline function in abstract.h |
| 464 | #[cfg_attr (PyPy, link_name = "PyPyObject_DelAttr" )] |
| 465 | pub fn PyObject_DelAttr(arg1: *mut PyObject, arg2: *mut PyObject) -> c_int; |
| 466 | #[cfg_attr (PyPy, link_name = "PyPyObject_HasAttr" )] |
| 467 | pub unsafefn PyObject_HasAttr(arg1: *mut PyObject, arg2: *mut PyObject) -> c_int; |
| 468 | #[cfg (Py_3_13)] |
| 469 | #[cfg_attr (PyPy, link_name = "PyPyObject_HasAttrWithError" )] |
| 470 | pub fn PyObject_HasAttrWithError(arg1: *mut PyObject, arg2: *mut PyObject) -> c_int; |
| 471 | #[cfg (Py_3_13)] |
| 472 | #[cfg_attr (PyPy, link_name = "PyPyObject_HasAttrStringWithError" )] |
| 473 | pub fn PyObject_HasAttrStringWithError(arg1: *mut PyObject, arg2: *const c_char) -> c_int; |
| 474 | #[cfg_attr (PyPy, link_name = "PyPyObject_SelfIter" )] |
| 475 | pub unsafefn PyObject_SelfIter(arg1: *mut PyObject) -> *mut PyObject; |
| 476 | #[cfg_attr (PyPy, link_name = "PyPyObject_GenericGetAttr" )] |
| 477 | pub unsafefn PyObject_GenericGetAttr(arg1: *mut PyObject, arg2: *mut PyObject) -> *mut PyObject; |
| 478 | #[cfg_attr (PyPy, link_name = "PyPyObject_GenericSetAttr" )] |
| 479 | pub unsafefn PyObject_GenericSetAttr( |
| 480 | arg1: *mut PyObject, |
| 481 | arg2: *mut PyObject, |
| 482 | arg3: *mut PyObject, |
| 483 | ) -> c_int; |
| 484 | #[cfg (not(all(Py_LIMITED_API, not(Py_3_10))))] |
| 485 | #[cfg_attr (PyPy, link_name = "PyPyObject_GenericGetDict" )] |
| 486 | pub unsafefn PyObject_GenericGetDict(arg1: *mut PyObject, arg2: *mut c_void) -> *mut PyObject; |
| 487 | #[cfg_attr (PyPy, link_name = "PyPyObject_GenericSetDict" )] |
| 488 | pub unsafefn PyObject_GenericSetDict( |
| 489 | arg1: *mut PyObject, |
| 490 | arg2: *mut PyObject, |
| 491 | arg3: *mut c_void, |
| 492 | ) -> c_int; |
| 493 | #[cfg_attr (PyPy, link_name = "PyPyObject_Hash" )] |
| 494 | pub unsafefn PyObject_Hash(arg1: *mut PyObject) -> Py_hash_t; |
| 495 | #[cfg_attr (PyPy, link_name = "PyPyObject_HashNotImplemented" )] |
| 496 | pub unsafefn PyObject_HashNotImplemented(arg1: *mut PyObject) -> Py_hash_t; |
| 497 | #[cfg_attr (PyPy, link_name = "PyPyObject_IsTrue" )] |
| 498 | pub unsafefn PyObject_IsTrue(arg1: *mut PyObject) -> c_int; |
| 499 | #[cfg_attr (PyPy, link_name = "PyPyObject_Not" )] |
| 500 | pub unsafefn PyObject_Not(arg1: *mut PyObject) -> c_int; |
| 501 | #[cfg_attr (PyPy, link_name = "PyPyCallable_Check" )] |
| 502 | pub unsafefn PyCallable_Check(arg1: *mut PyObject) -> c_int; |
| 503 | #[cfg_attr (PyPy, link_name = "PyPyObject_ClearWeakRefs" )] |
| 504 | pub unsafefn PyObject_ClearWeakRefs(arg1: *mut PyObject); |
| 505 | |
| 506 | #[cfg_attr (PyPy, link_name = "PyPyObject_Dir" )] |
| 507 | pub unsafefn PyObject_Dir(arg1: *mut PyObject) -> *mut PyObject; |
| 508 | pub unsafefn Py_ReprEnter(arg1: *mut PyObject) -> c_int; |
| 509 | pub unsafefn Py_ReprLeave(arg1: *mut PyObject); |
| 510 | } |
| 511 | |
| 512 | // Flag bits for printing: |
| 513 | pub const Py_PRINT_RAW: c_int = 1; // No string quotes etc. |
| 514 | |
| 515 | // skipped because is a private API |
| 516 | // const _Py_TPFLAGS_STATIC_BUILTIN: c_ulong = 1 << 1; |
| 517 | |
| 518 | #[cfg (all(Py_3_12, not(Py_LIMITED_API)))] |
| 519 | pub const Py_TPFLAGS_MANAGED_WEAKREF: c_ulong = 1 << 3; |
| 520 | |
| 521 | #[cfg (all(Py_3_11, not(Py_LIMITED_API)))] |
| 522 | pub const Py_TPFLAGS_MANAGED_DICT: c_ulong = 1 << 4; |
| 523 | |
| 524 | #[cfg (all(Py_3_10, not(Py_LIMITED_API)))] |
| 525 | pub const Py_TPFLAGS_SEQUENCE: c_ulong = 1 << 5; |
| 526 | |
| 527 | #[cfg (all(Py_3_10, not(Py_LIMITED_API)))] |
| 528 | pub const Py_TPFLAGS_MAPPING: c_ulong = 1 << 6; |
| 529 | |
| 530 | #[cfg (Py_3_10)] |
| 531 | pub const Py_TPFLAGS_DISALLOW_INSTANTIATION: c_ulong = 1 << 7; |
| 532 | |
| 533 | #[cfg (Py_3_10)] |
| 534 | pub const Py_TPFLAGS_IMMUTABLETYPE: c_ulong = 1 << 8; |
| 535 | |
| 536 | /// Set if the type object is dynamically allocated |
| 537 | pub const Py_TPFLAGS_HEAPTYPE: c_ulong = 1 << 9; |
| 538 | |
| 539 | /// Set if the type allows subclassing |
| 540 | pub const Py_TPFLAGS_BASETYPE: c_ulong = 1 << 10; |
| 541 | |
| 542 | /// Set if the type implements the vectorcall protocol (PEP 590) |
| 543 | #[cfg (any(Py_3_12, all(Py_3_8, not(Py_LIMITED_API))))] |
| 544 | pub const Py_TPFLAGS_HAVE_VECTORCALL: c_ulong = 1 << 11; |
| 545 | // skipped backwards-compatibility alias _Py_TPFLAGS_HAVE_VECTORCALL |
| 546 | |
| 547 | /// Set if the type is 'ready' -- fully initialized |
| 548 | pub const Py_TPFLAGS_READY: c_ulong = 1 << 12; |
| 549 | |
| 550 | /// Set while the type is being 'readied', to prevent recursive ready calls |
| 551 | pub const Py_TPFLAGS_READYING: c_ulong = 1 << 13; |
| 552 | |
| 553 | /// Objects support garbage collection (see objimp.h) |
| 554 | pub const Py_TPFLAGS_HAVE_GC: c_ulong = 1 << 14; |
| 555 | |
| 556 | const Py_TPFLAGS_HAVE_STACKLESS_EXTENSION: c_ulong = 0; |
| 557 | |
| 558 | #[cfg (Py_3_8)] |
| 559 | pub const Py_TPFLAGS_METHOD_DESCRIPTOR: c_ulong = 1 << 17; |
| 560 | |
| 561 | pub const Py_TPFLAGS_VALID_VERSION_TAG: c_ulong = 1 << 19; |
| 562 | |
| 563 | /* Type is abstract and cannot be instantiated */ |
| 564 | pub const Py_TPFLAGS_IS_ABSTRACT: c_ulong = 1 << 20; |
| 565 | |
| 566 | // skipped non-limited / 3.10 Py_TPFLAGS_HAVE_AM_SEND |
| 567 | #[cfg (Py_3_12)] |
| 568 | pub const Py_TPFLAGS_ITEMS_AT_END: c_ulong = 1 << 23; |
| 569 | |
| 570 | /* These flags are used to determine if a type is a subclass. */ |
| 571 | pub const Py_TPFLAGS_LONG_SUBCLASS: c_ulong = 1 << 24; |
| 572 | pub const Py_TPFLAGS_LIST_SUBCLASS: c_ulong = 1 << 25; |
| 573 | pub const Py_TPFLAGS_TUPLE_SUBCLASS: c_ulong = 1 << 26; |
| 574 | pub const Py_TPFLAGS_BYTES_SUBCLASS: c_ulong = 1 << 27; |
| 575 | pub const Py_TPFLAGS_UNICODE_SUBCLASS: c_ulong = 1 << 28; |
| 576 | pub const Py_TPFLAGS_DICT_SUBCLASS: c_ulong = 1 << 29; |
| 577 | pub const Py_TPFLAGS_BASE_EXC_SUBCLASS: c_ulong = 1 << 30; |
| 578 | pub const Py_TPFLAGS_TYPE_SUBCLASS: c_ulong = 1 << 31; |
| 579 | |
| 580 | pub const Py_TPFLAGS_DEFAULT: c_ulong = if cfg!(Py_3_10) { |
| 581 | Py_TPFLAGS_HAVE_STACKLESS_EXTENSION |
| 582 | } else { |
| 583 | Py_TPFLAGS_HAVE_STACKLESS_EXTENSION | Py_TPFLAGS_HAVE_VERSION_TAG |
| 584 | }; |
| 585 | |
| 586 | pub const Py_TPFLAGS_HAVE_FINALIZE: c_ulong = 1; |
| 587 | pub const Py_TPFLAGS_HAVE_VERSION_TAG: c_ulong = 1 << 18; |
| 588 | |
| 589 | unsafeextern "C" { |
| 590 | #[cfg (all(py_sys_config = "Py_REF_DEBUG" , not(Py_LIMITED_API)))] |
| 591 | fn _Py_NegativeRefcount(filename: *const c_char, lineno: c_int, op: *mut PyObject); |
| 592 | #[cfg (all(Py_3_12, py_sys_config = "Py_REF_DEBUG" , not(Py_LIMITED_API)))] |
| 593 | fn _Py_INCREF_IncRefTotal(); |
| 594 | #[cfg (all(Py_3_12, py_sys_config = "Py_REF_DEBUG" , not(Py_LIMITED_API)))] |
| 595 | fn _Py_DECREF_DecRefTotal(); |
| 596 | |
| 597 | #[cfg_attr (PyPy, link_name = "_PyPy_Dealloc" )] |
| 598 | unsafefn _Py_Dealloc(arg1: *mut PyObject); |
| 599 | |
| 600 | #[cfg_attr (PyPy, link_name = "PyPy_IncRef" )] |
| 601 | #[cfg_attr (GraalPy, link_name = "_Py_IncRef" )] |
| 602 | pub unsafefn Py_IncRef(o: *mut PyObject); |
| 603 | #[cfg_attr (PyPy, link_name = "PyPy_DecRef" )] |
| 604 | #[cfg_attr (GraalPy, link_name = "_Py_DecRef" )] |
| 605 | pub unsafefn Py_DecRef(o: *mut PyObject); |
| 606 | |
| 607 | #[cfg (all(Py_3_10, not(PyPy)))] |
| 608 | unsafefn _Py_IncRef(o: *mut PyObject); |
| 609 | #[cfg (all(Py_3_10, not(PyPy)))] |
| 610 | unsafefn _Py_DecRef(o: *mut PyObject); |
| 611 | |
| 612 | #[cfg (GraalPy)] |
| 613 | fn _Py_REFCNT(arg1: *const PyObject) -> Py_ssize_t; |
| 614 | |
| 615 | #[cfg (GraalPy)] |
| 616 | fn _Py_TYPE(arg1: *const PyObject) -> *mut PyTypeObject; |
| 617 | |
| 618 | #[cfg (GraalPy)] |
| 619 | fn _Py_SIZE(arg1: *const PyObject) -> Py_ssize_t; |
| 620 | } |
| 621 | |
| 622 | #[inline (always)] |
| 623 | pub unsafe fn Py_INCREF(op: *mut PyObject) { |
| 624 | // On limited API, the free-threaded build, or with refcount debugging, let the interpreter do refcounting |
| 625 | // TODO: reimplement the logic in the header in the free-threaded build, for a little bit of performance. |
| 626 | #[cfg (any( |
| 627 | Py_GIL_DISABLED, |
| 628 | Py_LIMITED_API, |
| 629 | py_sys_config = "Py_REF_DEBUG" , |
| 630 | GraalPy |
| 631 | ))] |
| 632 | { |
| 633 | // _Py_IncRef was added to the ABI in 3.10; skips null checks |
| 634 | #[cfg (all(Py_3_10, not(PyPy)))] |
| 635 | { |
| 636 | _Py_IncRef(op); |
| 637 | } |
| 638 | |
| 639 | #[cfg (any(not(Py_3_10), PyPy))] |
| 640 | { |
| 641 | Py_IncRef(op); |
| 642 | } |
| 643 | } |
| 644 | |
| 645 | // version-specific builds are allowed to directly manipulate the reference count |
| 646 | #[cfg (not(any( |
| 647 | Py_GIL_DISABLED, |
| 648 | Py_LIMITED_API, |
| 649 | py_sys_config = "Py_REF_DEBUG" , |
| 650 | GraalPy |
| 651 | )))] |
| 652 | { |
| 653 | #[cfg (all(Py_3_12, target_pointer_width = "64" ))] |
| 654 | { |
| 655 | let cur_refcnt = (*op).ob_refcnt.ob_refcnt_split[crate::PY_BIG_ENDIAN]; |
| 656 | let new_refcnt = cur_refcnt.wrapping_add(1); |
| 657 | if new_refcnt == 0 { |
| 658 | return; |
| 659 | } |
| 660 | (*op).ob_refcnt.ob_refcnt_split[crate::PY_BIG_ENDIAN] = new_refcnt; |
| 661 | } |
| 662 | |
| 663 | #[cfg (all(Py_3_12, target_pointer_width = "32" ))] |
| 664 | { |
| 665 | if _Py_IsImmortal(op) != 0 { |
| 666 | return; |
| 667 | } |
| 668 | (*op).ob_refcnt.ob_refcnt += 1 |
| 669 | } |
| 670 | |
| 671 | #[cfg (not(Py_3_12))] |
| 672 | { |
| 673 | (*op).ob_refcnt += 1 |
| 674 | } |
| 675 | |
| 676 | // Skipped _Py_INCREF_STAT_INC - if anyone wants this, please file an issue |
| 677 | // or submit a PR supporting Py_STATS build option and pystats.h |
| 678 | } |
| 679 | } |
| 680 | |
| 681 | #[inline (always)] |
| 682 | #[cfg_attr ( |
| 683 | all(py_sys_config = "Py_REF_DEBUG" , Py_3_12, not(Py_LIMITED_API)), |
| 684 | track_caller |
| 685 | )] |
| 686 | pub unsafe fn Py_DECREF(op: *mut PyObject) { |
| 687 | // On limited API, the free-threaded build, or with refcount debugging, let the interpreter do refcounting |
| 688 | // On 3.12+ we implement refcount debugging to get better assertion locations on negative refcounts |
| 689 | // TODO: reimplement the logic in the header in the free-threaded build, for a little bit of performance. |
| 690 | #[cfg (any( |
| 691 | Py_GIL_DISABLED, |
| 692 | Py_LIMITED_API, |
| 693 | all(py_sys_config = "Py_REF_DEBUG" , not(Py_3_12)), |
| 694 | GraalPy |
| 695 | ))] |
| 696 | { |
| 697 | // _Py_DecRef was added to the ABI in 3.10; skips null checks |
| 698 | #[cfg (all(Py_3_10, not(PyPy)))] |
| 699 | { |
| 700 | _Py_DecRef(op); |
| 701 | } |
| 702 | |
| 703 | #[cfg (any(not(Py_3_10), PyPy))] |
| 704 | { |
| 705 | Py_DecRef(op); |
| 706 | } |
| 707 | } |
| 708 | |
| 709 | #[cfg (not(any( |
| 710 | Py_GIL_DISABLED, |
| 711 | Py_LIMITED_API, |
| 712 | all(py_sys_config = "Py_REF_DEBUG" , not(Py_3_12)), |
| 713 | GraalPy |
| 714 | )))] |
| 715 | { |
| 716 | #[cfg (Py_3_12)] |
| 717 | if _Py_IsImmortal(op) != 0 { |
| 718 | return; |
| 719 | } |
| 720 | |
| 721 | // Skipped _Py_DECREF_STAT_INC - if anyone needs this, please file an issue |
| 722 | // or submit a PR supporting Py_STATS build option and pystats.h |
| 723 | |
| 724 | #[cfg (py_sys_config = "Py_REF_DEBUG" )] |
| 725 | _Py_DECREF_DecRefTotal(); |
| 726 | |
| 727 | #[cfg (Py_3_12)] |
| 728 | { |
| 729 | (*op).ob_refcnt.ob_refcnt -= 1; |
| 730 | |
| 731 | #[cfg (py_sys_config = "Py_REF_DEBUG" )] |
| 732 | if (*op).ob_refcnt.ob_refcnt < 0 { |
| 733 | let location = std::panic::Location::caller(); |
| 734 | let filename = std::ffi::CString::new(location.file()).unwrap(); |
| 735 | _Py_NegativeRefcount(filename.as_ptr(), location.line() as i32, op); |
| 736 | } |
| 737 | |
| 738 | if (*op).ob_refcnt.ob_refcnt == 0 { |
| 739 | _Py_Dealloc(op); |
| 740 | } |
| 741 | } |
| 742 | |
| 743 | #[cfg (not(Py_3_12))] |
| 744 | { |
| 745 | (*op).ob_refcnt -= 1; |
| 746 | |
| 747 | if (*op).ob_refcnt == 0 { |
| 748 | _Py_Dealloc(op); |
| 749 | } |
| 750 | } |
| 751 | } |
| 752 | } |
| 753 | |
| 754 | #[inline ] |
| 755 | pub unsafe fn Py_CLEAR(op: *mut *mut PyObject) { |
| 756 | let tmp: *mut PyObject = *op; |
| 757 | if !tmp.is_null() { |
| 758 | *op = ptr::null_mut(); |
| 759 | Py_DECREF(op:tmp); |
| 760 | } |
| 761 | } |
| 762 | |
| 763 | #[inline ] |
| 764 | pub unsafe fn Py_XINCREF(op: *mut PyObject) { |
| 765 | if !op.is_null() { |
| 766 | Py_INCREF(op) |
| 767 | } |
| 768 | } |
| 769 | |
| 770 | #[inline ] |
| 771 | pub unsafe fn Py_XDECREF(op: *mut PyObject) { |
| 772 | if !op.is_null() { |
| 773 | Py_DECREF(op) |
| 774 | } |
| 775 | } |
| 776 | |
| 777 | unsafeextern "C" { |
| 778 | #[cfg (all(Py_3_10, Py_LIMITED_API, not(PyPy)))] |
| 779 | #[cfg_attr (docsrs, doc(cfg(Py_3_10)))] |
| 780 | pub unsafefn Py_NewRef(obj: *mut PyObject) -> *mut PyObject; |
| 781 | #[cfg (all(Py_3_10, Py_LIMITED_API, not(PyPy)))] |
| 782 | #[cfg_attr (docsrs, doc(cfg(Py_3_10)))] |
| 783 | pub unsafefn Py_XNewRef(obj: *mut PyObject) -> *mut PyObject; |
| 784 | } |
| 785 | |
| 786 | // macro _Py_NewRef not public; reimplemented directly inside Py_NewRef here |
| 787 | // macro _Py_XNewRef not public; reimplemented directly inside Py_XNewRef here |
| 788 | |
| 789 | #[cfg (all(Py_3_10, any(not(Py_LIMITED_API), PyPy)))] |
| 790 | #[cfg_attr (docsrs, doc(cfg(Py_3_10)))] |
| 791 | #[inline ] |
| 792 | pub unsafe fn Py_NewRef(obj: *mut PyObject) -> *mut PyObject { |
| 793 | Py_INCREF(obj); |
| 794 | obj |
| 795 | } |
| 796 | |
| 797 | #[cfg (all(Py_3_10, any(not(Py_LIMITED_API), PyPy)))] |
| 798 | #[cfg_attr (docsrs, doc(cfg(Py_3_10)))] |
| 799 | #[inline ] |
| 800 | pub unsafe fn Py_XNewRef(obj: *mut PyObject) -> *mut PyObject { |
| 801 | Py_XINCREF(obj); |
| 802 | obj |
| 803 | } |
| 804 | |
| 805 | #[cfg (Py_3_13)] |
| 806 | pub const Py_CONSTANT_NONE: c_uint = 0; |
| 807 | #[cfg (Py_3_13)] |
| 808 | pub const Py_CONSTANT_FALSE: c_uint = 1; |
| 809 | #[cfg (Py_3_13)] |
| 810 | pub const Py_CONSTANT_TRUE: c_uint = 2; |
| 811 | #[cfg (Py_3_13)] |
| 812 | pub const Py_CONSTANT_ELLIPSIS: c_uint = 3; |
| 813 | #[cfg (Py_3_13)] |
| 814 | pub const Py_CONSTANT_NOT_IMPLEMENTED: c_uint = 4; |
| 815 | #[cfg (Py_3_13)] |
| 816 | pub const Py_CONSTANT_ZERO: c_uint = 5; |
| 817 | #[cfg (Py_3_13)] |
| 818 | pub const Py_CONSTANT_ONE: c_uint = 6; |
| 819 | #[cfg (Py_3_13)] |
| 820 | pub const Py_CONSTANT_EMPTY_STR: c_uint = 7; |
| 821 | #[cfg (Py_3_13)] |
| 822 | pub const Py_CONSTANT_EMPTY_BYTES: c_uint = 8; |
| 823 | #[cfg (Py_3_13)] |
| 824 | pub const Py_CONSTANT_EMPTY_TUPLE: c_uint = 9; |
| 825 | |
| 826 | unsafeextern "C" { |
| 827 | #[cfg (Py_3_13)] |
| 828 | #[cfg_attr (PyPy, link_name = "PyPy_GetConstant" )] |
| 829 | pub fn Py_GetConstant(constant_id: c_uint) -> *mut PyObject; |
| 830 | #[cfg (Py_3_13)] |
| 831 | #[cfg_attr (PyPy, link_name = "PyPy_GetConstantBorrowed" )] |
| 832 | pub fn Py_GetConstantBorrowed(constant_id: c_uint) -> *mut PyObject; |
| 833 | } |
| 834 | |
| 835 | #[cfg_attr (windows, link(name = "pythonXY" ))] |
| 836 | unsafeextern "C" { |
| 837 | #[cfg (all(not(GraalPy), not(all(Py_3_13, Py_LIMITED_API))))] |
| 838 | #[cfg_attr (PyPy, link_name = "_PyPy_NoneStruct" )] |
| 839 | unsafestatic mut _Py_NoneStruct: PyObject; |
| 840 | |
| 841 | #[cfg (GraalPy)] |
| 842 | static mut _Py_NoneStructReference: *mut PyObject; |
| 843 | } |
| 844 | |
| 845 | #[inline ] |
| 846 | pub unsafe fn Py_None() -> *mut PyObject { |
| 847 | #[cfg (all(not(GraalPy), all(Py_3_13, Py_LIMITED_API)))] |
| 848 | return Py_GetConstantBorrowed(Py_CONSTANT_NONE); |
| 849 | |
| 850 | #[cfg (all(not(GraalPy), not(all(Py_3_13, Py_LIMITED_API))))] |
| 851 | return ptr::addr_of_mut!(_Py_NoneStruct); |
| 852 | |
| 853 | #[cfg (GraalPy)] |
| 854 | return _Py_NoneStructReference; |
| 855 | } |
| 856 | |
| 857 | #[inline ] |
| 858 | pub unsafe fn Py_IsNone(x: *mut PyObject) -> c_int { |
| 859 | Py_Is(x, y:Py_None()) |
| 860 | } |
| 861 | |
| 862 | // skipped Py_RETURN_NONE |
| 863 | |
| 864 | #[cfg_attr (windows, link(name = "pythonXY" ))] |
| 865 | unsafeextern "C" { |
| 866 | #[cfg (all(not(GraalPy), not(all(Py_3_13, Py_LIMITED_API))))] |
| 867 | #[cfg_attr (PyPy, link_name = "_PyPy_NotImplementedStruct" )] |
| 868 | unsafestatic mut _Py_NotImplementedStruct: PyObject; |
| 869 | |
| 870 | #[cfg (GraalPy)] |
| 871 | static mut _Py_NotImplementedStructReference: *mut PyObject; |
| 872 | } |
| 873 | |
| 874 | #[inline ] |
| 875 | pub unsafe fn Py_NotImplemented() -> *mut PyObject { |
| 876 | #[cfg (all(not(GraalPy), all(Py_3_13, Py_LIMITED_API)))] |
| 877 | return Py_GetConstantBorrowed(Py_CONSTANT_NOT_IMPLEMENTED); |
| 878 | |
| 879 | #[cfg (all(not(GraalPy), not(all(Py_3_13, Py_LIMITED_API))))] |
| 880 | return ptr::addr_of_mut!(_Py_NotImplementedStruct); |
| 881 | |
| 882 | #[cfg (GraalPy)] |
| 883 | return _Py_NotImplementedStructReference; |
| 884 | } |
| 885 | |
| 886 | // skipped Py_RETURN_NOTIMPLEMENTED |
| 887 | |
| 888 | /* Rich comparison opcodes */ |
| 889 | pub const Py_LT: c_int = 0; |
| 890 | pub const Py_LE: c_int = 1; |
| 891 | pub const Py_EQ: c_int = 2; |
| 892 | pub const Py_NE: c_int = 3; |
| 893 | pub const Py_GT: c_int = 4; |
| 894 | pub const Py_GE: c_int = 5; |
| 895 | |
| 896 | #[cfg (Py_3_10)] |
| 897 | #[repr (C)] |
| 898 | #[derive (Copy, Clone, Debug, PartialEq, Eq)] |
| 899 | pub enum PySendResult { |
| 900 | PYGEN_RETURN = 0, |
| 901 | PYGEN_ERROR = -1, |
| 902 | PYGEN_NEXT = 1, |
| 903 | } |
| 904 | |
| 905 | // skipped Py_RETURN_RICHCOMPARE |
| 906 | |
| 907 | #[inline ] |
| 908 | pub unsafe fn PyType_HasFeature(ty: *mut PyTypeObject, feature: c_ulong) -> c_int { |
| 909 | #[cfg (Py_LIMITED_API)] |
| 910 | let flags = PyType_GetFlags(arg1:ty); |
| 911 | |
| 912 | #[cfg (all(not(Py_LIMITED_API), Py_GIL_DISABLED))] |
| 913 | let flags = (*ty).tp_flags.load(std::sync::atomic::Ordering::Relaxed); |
| 914 | |
| 915 | #[cfg (all(not(Py_LIMITED_API), not(Py_GIL_DISABLED)))] |
| 916 | let flags = (*ty).tp_flags; |
| 917 | |
| 918 | ((flags & feature) != 0) as c_int |
| 919 | } |
| 920 | |
| 921 | #[inline ] |
| 922 | pub unsafe fn PyType_FastSubclass(t: *mut PyTypeObject, f: c_ulong) -> c_int { |
| 923 | PyType_HasFeature(ty:t, feature:f) |
| 924 | } |
| 925 | |
| 926 | #[inline ] |
| 927 | pub unsafe fn PyType_Check(op: *mut PyObject) -> c_int { |
| 928 | PyType_FastSubclass(t:Py_TYPE(op), Py_TPFLAGS_TYPE_SUBCLASS) |
| 929 | } |
| 930 | |
| 931 | // skipped _PyType_CAST |
| 932 | |
| 933 | #[inline ] |
| 934 | pub unsafe fn PyType_CheckExact(op: *mut PyObject) -> c_int { |
| 935 | Py_IS_TYPE(ob:op, tp:ptr::addr_of_mut!(PyType_Type)) |
| 936 | } |
| 937 | |
| 938 | unsafeextern "C" { |
| 939 | #[cfg (any(Py_3_13, all(Py_3_11, not(Py_LIMITED_API))))] |
| 940 | #[cfg_attr (PyPy, link_name = "PyPyType_GetModuleByDef" )] |
| 941 | pub fn PyType_GetModuleByDef( |
| 942 | arg1: *mut crate::PyTypeObject, |
| 943 | arg2: *mut crate::PyModuleDef, |
| 944 | ) -> *mut PyObject; |
| 945 | } |
| 946 | |