File indexing completed on 2025-11-19 09:50:54
0001 #ifndef Py_OBJECT_H
0002 #define Py_OBJECT_H
0003 #ifdef __cplusplus
0004 extern "C" {
0005 #endif
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055 #if defined(Py_DEBUG) && !defined(Py_REF_DEBUG)
0056 # define Py_REF_DEBUG
0057 #endif
0058
0059
0060 #define PyObject_HEAD PyObject ob_base;
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076 #if SIZEOF_VOID_P > 4
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091 #define _Py_IMMORTAL_REFCNT _Py_CAST(Py_ssize_t, UINT_MAX)
0092
0093 #else
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106 #define _Py_IMMORTAL_REFCNT _Py_CAST(Py_ssize_t, UINT_MAX >> 2)
0107 #endif
0108
0109
0110
0111 #ifdef Py_GIL_DISABLED
0112 #define _Py_IMMORTAL_REFCNT_LOCAL UINT32_MAX
0113 #endif
0114
0115
0116 #define _PyObject_EXTRA_INIT
0117
0118
0119
0120
0121
0122
0123 #if defined(Py_GIL_DISABLED)
0124 #define PyObject_HEAD_INIT(type) \
0125 { \
0126 0, \
0127 0, \
0128 { 0 }, \
0129 0, \
0130 _Py_IMMORTAL_REFCNT_LOCAL, \
0131 0, \
0132 (type), \
0133 },
0134 #else
0135 #define PyObject_HEAD_INIT(type) \
0136 { \
0137 { _Py_IMMORTAL_REFCNT }, \
0138 (type) \
0139 },
0140 #endif
0141
0142 #define PyVarObject_HEAD_INIT(type, size) \
0143 { \
0144 PyObject_HEAD_INIT(type) \
0145 (size) \
0146 },
0147
0148
0149
0150
0151
0152
0153
0154 #define PyObject_VAR_HEAD PyVarObject ob_base;
0155 #define Py_INVALID_SIZE (Py_ssize_t)-1
0156
0157
0158
0159
0160
0161
0162 #ifndef Py_GIL_DISABLED
0163 struct _object {
0164 #if (defined(__GNUC__) || defined(__clang__)) \
0165 && !(defined __STDC_VERSION__ && __STDC_VERSION__ >= 201112L)
0166
0167 __extension__
0168 #endif
0169 #ifdef _MSC_VER
0170
0171
0172 __pragma(warning(push))
0173 __pragma(warning(disable: 4201))
0174 #endif
0175 union {
0176 Py_ssize_t ob_refcnt;
0177 #if SIZEOF_VOID_P > 4
0178 PY_UINT32_T ob_refcnt_split[2];
0179 #endif
0180 };
0181 #ifdef _MSC_VER
0182 __pragma(warning(pop))
0183 #endif
0184
0185 PyTypeObject *ob_type;
0186 };
0187 #else
0188
0189
0190
0191 #define _Py_UNOWNED_TID 0
0192
0193
0194
0195 #define _Py_REF_SHARED_SHIFT 2
0196 #define _Py_REF_SHARED_FLAG_MASK 0x3
0197
0198
0199 #define _Py_REF_SHARED_INIT 0x0
0200 #define _Py_REF_MAYBE_WEAKREF 0x1
0201 #define _Py_REF_QUEUED 0x2
0202 #define _Py_REF_MERGED 0x3
0203
0204
0205 #define _Py_REF_SHARED(refcnt, flags) (((refcnt) << _Py_REF_SHARED_SHIFT) + (flags))
0206
0207 struct _object {
0208
0209
0210
0211 uintptr_t ob_tid;
0212 uint16_t _padding;
0213 PyMutex ob_mutex;
0214 uint8_t ob_gc_bits;
0215 uint32_t ob_ref_local;
0216 Py_ssize_t ob_ref_shared;
0217 PyTypeObject *ob_type;
0218 };
0219 #endif
0220
0221
0222 #define _PyObject_CAST(op) _Py_CAST(PyObject*, (op))
0223
0224 typedef struct {
0225 PyObject ob_base;
0226 Py_ssize_t ob_size;
0227 } PyVarObject;
0228
0229
0230 #define _PyVarObject_CAST(op) _Py_CAST(PyVarObject*, (op))
0231
0232
0233
0234 PyAPI_FUNC(int) Py_Is(PyObject *x, PyObject *y);
0235 #define Py_Is(x, y) ((x) == (y))
0236
0237 #if defined(Py_GIL_DISABLED) && !defined(Py_LIMITED_API)
0238 PyAPI_FUNC(uintptr_t) _Py_GetThreadLocal_Addr(void);
0239
0240 static inline uintptr_t
0241 _Py_ThreadId(void)
0242 {
0243 uintptr_t tid;
0244 #if defined(_MSC_VER) && defined(_M_X64)
0245 tid = __readgsqword(48);
0246 #elif defined(_MSC_VER) && defined(_M_IX86)
0247 tid = __readfsdword(24);
0248 #elif defined(_MSC_VER) && defined(_M_ARM64)
0249 tid = __getReg(18);
0250 #elif defined(__MINGW32__) && defined(_M_X64)
0251 tid = __readgsqword(48);
0252 #elif defined(__MINGW32__) && defined(_M_IX86)
0253 tid = __readfsdword(24);
0254 #elif defined(__MINGW32__) && defined(_M_ARM64)
0255 tid = __getReg(18);
0256 #elif defined(__i386__)
0257 __asm__("movl %%gs:0, %0" : "=r" (tid));
0258 #elif defined(__MACH__) && defined(__x86_64__)
0259 __asm__("movq %%gs:0, %0" : "=r" (tid));
0260 #elif defined(__x86_64__)
0261 __asm__("movq %%fs:0, %0" : "=r" (tid));
0262 #elif defined(__arm__) && __ARM_ARCH >= 7
0263 __asm__ ("mrc p15, 0, %0, c13, c0, 3\nbic %0, %0, #3" : "=r" (tid));
0264 #elif defined(__aarch64__) && defined(__APPLE__)
0265 __asm__ ("mrs %0, tpidrro_el0" : "=r" (tid));
0266 #elif defined(__aarch64__)
0267 __asm__ ("mrs %0, tpidr_el0" : "=r" (tid));
0268 #elif defined(__powerpc64__)
0269 #if defined(__clang__) && _Py__has_builtin(__builtin_thread_pointer)
0270 tid = (uintptr_t)__builtin_thread_pointer();
0271 #else
0272
0273 register uintptr_t tp __asm__ ("r13");
0274 __asm__("" : "=r" (tp));
0275 tid = tp;
0276 #endif
0277 #elif defined(__powerpc__)
0278 #if defined(__clang__) && _Py__has_builtin(__builtin_thread_pointer)
0279 tid = (uintptr_t)__builtin_thread_pointer();
0280 #else
0281
0282 register uintptr_t tp __asm__ ("r2");
0283 __asm__ ("" : "=r" (tp));
0284 tid = tp;
0285 #endif
0286 #elif defined(__s390__) && defined(__GNUC__)
0287
0288
0289 tid = (uintptr_t)__builtin_thread_pointer();
0290 #elif defined(__riscv)
0291 #if defined(__clang__) && _Py__has_builtin(__builtin_thread_pointer)
0292 tid = (uintptr_t)__builtin_thread_pointer();
0293 #else
0294
0295 __asm__ ("mv %0, tp" : "=r" (tid));
0296 #endif
0297 #else
0298
0299
0300 tid = _Py_GetThreadLocal_Addr();
0301 #endif
0302 return tid;
0303 }
0304
0305 static inline Py_ALWAYS_INLINE int
0306 _Py_IsOwnedByCurrentThread(PyObject *ob)
0307 {
0308 #ifdef _Py_THREAD_SANITIZER
0309 return _Py_atomic_load_uintptr_relaxed(&ob->ob_tid) == _Py_ThreadId();
0310 #else
0311 return ob->ob_tid == _Py_ThreadId();
0312 #endif
0313 }
0314 #endif
0315
0316 static inline Py_ssize_t Py_REFCNT(PyObject *ob) {
0317 #if !defined(Py_GIL_DISABLED)
0318 return ob->ob_refcnt;
0319 #else
0320 uint32_t local = _Py_atomic_load_uint32_relaxed(&ob->ob_ref_local);
0321 if (local == _Py_IMMORTAL_REFCNT_LOCAL) {
0322 return _Py_IMMORTAL_REFCNT;
0323 }
0324 Py_ssize_t shared = _Py_atomic_load_ssize_relaxed(&ob->ob_ref_shared);
0325 return _Py_STATIC_CAST(Py_ssize_t, local) +
0326 Py_ARITHMETIC_RIGHT_SHIFT(Py_ssize_t, shared, _Py_REF_SHARED_SHIFT);
0327 #endif
0328 }
0329 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000
0330 # define Py_REFCNT(ob) Py_REFCNT(_PyObject_CAST(ob))
0331 #endif
0332
0333
0334
0335 static inline PyTypeObject* Py_TYPE(PyObject *ob) {
0336 return ob->ob_type;
0337 }
0338 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000
0339 # define Py_TYPE(ob) Py_TYPE(_PyObject_CAST(ob))
0340 #endif
0341
0342 PyAPI_DATA(PyTypeObject) PyLong_Type;
0343 PyAPI_DATA(PyTypeObject) PyBool_Type;
0344
0345
0346 static inline Py_ssize_t Py_SIZE(PyObject *ob) {
0347 assert(ob->ob_type != &PyLong_Type);
0348 assert(ob->ob_type != &PyBool_Type);
0349 return _PyVarObject_CAST(ob)->ob_size;
0350 }
0351 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000
0352 # define Py_SIZE(ob) Py_SIZE(_PyObject_CAST(ob))
0353 #endif
0354
0355 static inline Py_ALWAYS_INLINE int _Py_IsImmortal(PyObject *op)
0356 {
0357 #if defined(Py_GIL_DISABLED)
0358 return (_Py_atomic_load_uint32_relaxed(&op->ob_ref_local) ==
0359 _Py_IMMORTAL_REFCNT_LOCAL);
0360 #elif SIZEOF_VOID_P > 4
0361 return (_Py_CAST(PY_INT32_T, op->ob_refcnt) < 0);
0362 #else
0363 return (op->ob_refcnt == _Py_IMMORTAL_REFCNT);
0364 #endif
0365 }
0366 #define _Py_IsImmortal(op) _Py_IsImmortal(_PyObject_CAST(op))
0367
0368 static inline int Py_IS_TYPE(PyObject *ob, PyTypeObject *type) {
0369 return Py_TYPE(ob) == type;
0370 }
0371 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000
0372 # define Py_IS_TYPE(ob, type) Py_IS_TYPE(_PyObject_CAST(ob), (type))
0373 #endif
0374
0375
0376
0377 PyAPI_FUNC(void) _Py_SetRefcnt(PyObject *ob, Py_ssize_t refcnt);
0378
0379 static inline void Py_SET_REFCNT(PyObject *ob, Py_ssize_t refcnt) {
0380 #if defined(Py_LIMITED_API) && Py_LIMITED_API+0 >= 0x030d0000
0381
0382
0383 _Py_SetRefcnt(ob, refcnt);
0384 #else
0385
0386
0387
0388
0389 if (_Py_IsImmortal(ob)) {
0390 return;
0391 }
0392
0393 #ifndef Py_GIL_DISABLED
0394 ob->ob_refcnt = refcnt;
0395 #else
0396 if (_Py_IsOwnedByCurrentThread(ob)) {
0397 if ((size_t)refcnt > (size_t)UINT32_MAX) {
0398
0399 ob->ob_tid = _Py_UNOWNED_TID;
0400 ob->ob_ref_local = _Py_IMMORTAL_REFCNT_LOCAL;
0401 ob->ob_ref_shared = 0;
0402 }
0403 else {
0404
0405
0406 ob->ob_ref_local = _Py_STATIC_CAST(uint32_t, refcnt);
0407 ob->ob_ref_shared &= _Py_REF_SHARED_FLAG_MASK;
0408 }
0409 }
0410 else {
0411
0412
0413 ob->ob_tid = _Py_UNOWNED_TID;
0414 ob->ob_ref_local = 0;
0415 ob->ob_ref_shared = _Py_REF_SHARED(refcnt, _Py_REF_MERGED);
0416 }
0417 #endif
0418 #endif
0419 }
0420 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000
0421 # define Py_SET_REFCNT(ob, refcnt) Py_SET_REFCNT(_PyObject_CAST(ob), (refcnt))
0422 #endif
0423
0424
0425 static inline void Py_SET_TYPE(PyObject *ob, PyTypeObject *type) {
0426 ob->ob_type = type;
0427 }
0428 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000
0429 # define Py_SET_TYPE(ob, type) Py_SET_TYPE(_PyObject_CAST(ob), type)
0430 #endif
0431
0432 static inline void Py_SET_SIZE(PyVarObject *ob, Py_ssize_t size) {
0433 assert(ob->ob_base.ob_type != &PyLong_Type);
0434 assert(ob->ob_base.ob_type != &PyBool_Type);
0435 #ifdef Py_GIL_DISABLED
0436 _Py_atomic_store_ssize_relaxed(&ob->ob_size, size);
0437 #else
0438 ob->ob_size = size;
0439 #endif
0440 }
0441 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000
0442 # define Py_SET_SIZE(ob, size) Py_SET_SIZE(_PyVarObject_CAST(ob), (size))
0443 #endif
0444
0445
0446
0447
0448
0449
0450
0451
0452
0453
0454
0455
0456
0457
0458
0459
0460
0461 typedef PyObject * (*unaryfunc)(PyObject *);
0462 typedef PyObject * (*binaryfunc)(PyObject *, PyObject *);
0463 typedef PyObject * (*ternaryfunc)(PyObject *, PyObject *, PyObject *);
0464 typedef int (*inquiry)(PyObject *);
0465 typedef Py_ssize_t (*lenfunc)(PyObject *);
0466 typedef PyObject *(*ssizeargfunc)(PyObject *, Py_ssize_t);
0467 typedef PyObject *(*ssizessizeargfunc)(PyObject *, Py_ssize_t, Py_ssize_t);
0468 typedef int(*ssizeobjargproc)(PyObject *, Py_ssize_t, PyObject *);
0469 typedef int(*ssizessizeobjargproc)(PyObject *, Py_ssize_t, Py_ssize_t, PyObject *);
0470 typedef int(*objobjargproc)(PyObject *, PyObject *, PyObject *);
0471
0472 typedef int (*objobjproc)(PyObject *, PyObject *);
0473 typedef int (*visitproc)(PyObject *, void *);
0474 typedef int (*traverseproc)(PyObject *, visitproc, void *);
0475
0476
0477 typedef void (*freefunc)(void *);
0478 typedef void (*destructor)(PyObject *);
0479 typedef PyObject *(*getattrfunc)(PyObject *, char *);
0480 typedef PyObject *(*getattrofunc)(PyObject *, PyObject *);
0481 typedef int (*setattrfunc)(PyObject *, char *, PyObject *);
0482 typedef int (*setattrofunc)(PyObject *, PyObject *, PyObject *);
0483 typedef PyObject *(*reprfunc)(PyObject *);
0484 typedef Py_hash_t (*hashfunc)(PyObject *);
0485 typedef PyObject *(*richcmpfunc) (PyObject *, PyObject *, int);
0486 typedef PyObject *(*getiterfunc) (PyObject *);
0487 typedef PyObject *(*iternextfunc) (PyObject *);
0488 typedef PyObject *(*descrgetfunc) (PyObject *, PyObject *, PyObject *);
0489 typedef int (*descrsetfunc) (PyObject *, PyObject *, PyObject *);
0490 typedef int (*initproc)(PyObject *, PyObject *, PyObject *);
0491 typedef PyObject *(*newfunc)(PyTypeObject *, PyObject *, PyObject *);
0492 typedef PyObject *(*allocfunc)(PyTypeObject *, Py_ssize_t);
0493
0494 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030c0000
0495 typedef PyObject *(*vectorcallfunc)(PyObject *callable, PyObject *const *args,
0496 size_t nargsf, PyObject *kwnames);
0497 #endif
0498
0499 typedef struct{
0500 int slot;
0501 void *pfunc;
0502 } PyType_Slot;
0503
0504 typedef struct{
0505 const char* name;
0506 int basicsize;
0507 int itemsize;
0508 unsigned int flags;
0509 PyType_Slot *slots;
0510 } PyType_Spec;
0511
0512 PyAPI_FUNC(PyObject*) PyType_FromSpec(PyType_Spec*);
0513 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000
0514 PyAPI_FUNC(PyObject*) PyType_FromSpecWithBases(PyType_Spec*, PyObject*);
0515 #endif
0516 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03040000
0517 PyAPI_FUNC(void*) PyType_GetSlot(PyTypeObject*, int);
0518 #endif
0519 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03090000
0520 PyAPI_FUNC(PyObject*) PyType_FromModuleAndSpec(PyObject *, PyType_Spec *, PyObject *);
0521 PyAPI_FUNC(PyObject *) PyType_GetModule(PyTypeObject *);
0522 PyAPI_FUNC(void *) PyType_GetModuleState(PyTypeObject *);
0523 #endif
0524 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030B0000
0525 PyAPI_FUNC(PyObject *) PyType_GetName(PyTypeObject *);
0526 PyAPI_FUNC(PyObject *) PyType_GetQualName(PyTypeObject *);
0527 #endif
0528 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030D0000
0529 PyAPI_FUNC(PyObject *) PyType_GetFullyQualifiedName(PyTypeObject *type);
0530 PyAPI_FUNC(PyObject *) PyType_GetModuleName(PyTypeObject *type);
0531 #endif
0532 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030C0000
0533 PyAPI_FUNC(PyObject *) PyType_FromMetaclass(PyTypeObject*, PyObject*, PyType_Spec*, PyObject*);
0534 PyAPI_FUNC(void *) PyObject_GetTypeData(PyObject *obj, PyTypeObject *cls);
0535 PyAPI_FUNC(Py_ssize_t) PyType_GetTypeDataSize(PyTypeObject *cls);
0536 #endif
0537
0538
0539 PyAPI_FUNC(int) PyType_IsSubtype(PyTypeObject *, PyTypeObject *);
0540
0541 static inline int PyObject_TypeCheck(PyObject *ob, PyTypeObject *type) {
0542 return Py_IS_TYPE(ob, type) || PyType_IsSubtype(Py_TYPE(ob), type);
0543 }
0544 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000
0545 # define PyObject_TypeCheck(ob, type) PyObject_TypeCheck(_PyObject_CAST(ob), (type))
0546 #endif
0547
0548 PyAPI_DATA(PyTypeObject) PyType_Type;
0549 PyAPI_DATA(PyTypeObject) PyBaseObject_Type;
0550 PyAPI_DATA(PyTypeObject) PySuper_Type;
0551
0552 PyAPI_FUNC(unsigned long) PyType_GetFlags(PyTypeObject*);
0553
0554 PyAPI_FUNC(int) PyType_Ready(PyTypeObject *);
0555 PyAPI_FUNC(PyObject *) PyType_GenericAlloc(PyTypeObject *, Py_ssize_t);
0556 PyAPI_FUNC(PyObject *) PyType_GenericNew(PyTypeObject *,
0557 PyObject *, PyObject *);
0558 PyAPI_FUNC(unsigned int) PyType_ClearCache(void);
0559 PyAPI_FUNC(void) PyType_Modified(PyTypeObject *);
0560
0561
0562 PyAPI_FUNC(PyObject *) PyObject_Repr(PyObject *);
0563 PyAPI_FUNC(PyObject *) PyObject_Str(PyObject *);
0564 PyAPI_FUNC(PyObject *) PyObject_ASCII(PyObject *);
0565 PyAPI_FUNC(PyObject *) PyObject_Bytes(PyObject *);
0566 PyAPI_FUNC(PyObject *) PyObject_RichCompare(PyObject *, PyObject *, int);
0567 PyAPI_FUNC(int) PyObject_RichCompareBool(PyObject *, PyObject *, int);
0568 PyAPI_FUNC(PyObject *) PyObject_GetAttrString(PyObject *, const char *);
0569 PyAPI_FUNC(int) PyObject_SetAttrString(PyObject *, const char *, PyObject *);
0570 PyAPI_FUNC(int) PyObject_DelAttrString(PyObject *v, const char *name);
0571 PyAPI_FUNC(int) PyObject_HasAttrString(PyObject *, const char *);
0572 PyAPI_FUNC(PyObject *) PyObject_GetAttr(PyObject *, PyObject *);
0573 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030d0000
0574 PyAPI_FUNC(int) PyObject_GetOptionalAttr(PyObject *, PyObject *, PyObject **);
0575 PyAPI_FUNC(int) PyObject_GetOptionalAttrString(PyObject *, const char *, PyObject **);
0576 #endif
0577 PyAPI_FUNC(int) PyObject_SetAttr(PyObject *, PyObject *, PyObject *);
0578 PyAPI_FUNC(int) PyObject_DelAttr(PyObject *v, PyObject *name);
0579 PyAPI_FUNC(int) PyObject_HasAttr(PyObject *, PyObject *);
0580 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030d0000
0581 PyAPI_FUNC(int) PyObject_HasAttrWithError(PyObject *, PyObject *);
0582 PyAPI_FUNC(int) PyObject_HasAttrStringWithError(PyObject *, const char *);
0583 #endif
0584 PyAPI_FUNC(PyObject *) PyObject_SelfIter(PyObject *);
0585 PyAPI_FUNC(PyObject *) PyObject_GenericGetAttr(PyObject *, PyObject *);
0586 PyAPI_FUNC(int) PyObject_GenericSetAttr(PyObject *, PyObject *, PyObject *);
0587 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000
0588 PyAPI_FUNC(int) PyObject_GenericSetDict(PyObject *, PyObject *, void *);
0589 #endif
0590 PyAPI_FUNC(Py_hash_t) PyObject_Hash(PyObject *);
0591 PyAPI_FUNC(Py_hash_t) PyObject_HashNotImplemented(PyObject *);
0592 PyAPI_FUNC(int) PyObject_IsTrue(PyObject *);
0593 PyAPI_FUNC(int) PyObject_Not(PyObject *);
0594 PyAPI_FUNC(int) PyCallable_Check(PyObject *);
0595 PyAPI_FUNC(void) PyObject_ClearWeakRefs(PyObject *);
0596
0597
0598
0599
0600
0601
0602 PyAPI_FUNC(PyObject *) PyObject_Dir(PyObject *);
0603
0604
0605 PyAPI_FUNC(int) Py_ReprEnter(PyObject *);
0606 PyAPI_FUNC(void) Py_ReprLeave(PyObject *);
0607
0608
0609 #define Py_PRINT_RAW 1
0610
0611
0612
0613
0614
0615
0616
0617
0618
0619
0620
0621
0622
0623
0624
0625
0626
0627
0628
0629
0630
0631 #ifndef Py_LIMITED_API
0632
0633
0634 #define _Py_TPFLAGS_STATIC_BUILTIN (1 << 1)
0635
0636
0637
0638
0639 #define Py_TPFLAGS_INLINE_VALUES (1 << 2)
0640
0641
0642
0643
0644 #define Py_TPFLAGS_MANAGED_WEAKREF (1 << 3)
0645
0646
0647
0648
0649 #define Py_TPFLAGS_MANAGED_DICT (1 << 4)
0650
0651 #define Py_TPFLAGS_PREHEADER (Py_TPFLAGS_MANAGED_WEAKREF | Py_TPFLAGS_MANAGED_DICT)
0652
0653
0654 #define Py_TPFLAGS_SEQUENCE (1 << 5)
0655
0656 #define Py_TPFLAGS_MAPPING (1 << 6)
0657 #endif
0658
0659
0660
0661 #define Py_TPFLAGS_DISALLOW_INSTANTIATION (1UL << 7)
0662
0663
0664 #define Py_TPFLAGS_IMMUTABLETYPE (1UL << 8)
0665
0666
0667 #define Py_TPFLAGS_HEAPTYPE (1UL << 9)
0668
0669
0670 #define Py_TPFLAGS_BASETYPE (1UL << 10)
0671
0672
0673 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030C0000
0674 #define Py_TPFLAGS_HAVE_VECTORCALL (1UL << 11)
0675 #ifndef Py_LIMITED_API
0676
0677 #define _Py_TPFLAGS_HAVE_VECTORCALL Py_TPFLAGS_HAVE_VECTORCALL
0678 #endif
0679 #endif
0680
0681
0682 #define Py_TPFLAGS_READY (1UL << 12)
0683
0684
0685 #define Py_TPFLAGS_READYING (1UL << 13)
0686
0687
0688 #define Py_TPFLAGS_HAVE_GC (1UL << 14)
0689
0690
0691 #ifdef STACKLESS
0692 #define Py_TPFLAGS_HAVE_STACKLESS_EXTENSION (3UL << 15)
0693 #else
0694 #define Py_TPFLAGS_HAVE_STACKLESS_EXTENSION 0
0695 #endif
0696
0697
0698 #define Py_TPFLAGS_METHOD_DESCRIPTOR (1UL << 17)
0699
0700
0701 #define Py_TPFLAGS_VALID_VERSION_TAG (1UL << 19)
0702
0703
0704 #define Py_TPFLAGS_IS_ABSTRACT (1UL << 20)
0705
0706
0707
0708
0709 #define _Py_TPFLAGS_MATCH_SELF (1UL << 22)
0710
0711
0712 #define Py_TPFLAGS_ITEMS_AT_END (1UL << 23)
0713
0714
0715 #define Py_TPFLAGS_LONG_SUBCLASS (1UL << 24)
0716 #define Py_TPFLAGS_LIST_SUBCLASS (1UL << 25)
0717 #define Py_TPFLAGS_TUPLE_SUBCLASS (1UL << 26)
0718 #define Py_TPFLAGS_BYTES_SUBCLASS (1UL << 27)
0719 #define Py_TPFLAGS_UNICODE_SUBCLASS (1UL << 28)
0720 #define Py_TPFLAGS_DICT_SUBCLASS (1UL << 29)
0721 #define Py_TPFLAGS_BASE_EXC_SUBCLASS (1UL << 30)
0722 #define Py_TPFLAGS_TYPE_SUBCLASS (1UL << 31)
0723
0724 #define Py_TPFLAGS_DEFAULT ( \
0725 Py_TPFLAGS_HAVE_STACKLESS_EXTENSION | \
0726 0)
0727
0728
0729
0730
0731
0732
0733
0734
0735
0736
0737
0738
0739
0740
0741 #define Py_TPFLAGS_HAVE_FINALIZE (1UL << 0)
0742 #define Py_TPFLAGS_HAVE_VERSION_TAG (1UL << 18)
0743
0744
0745
0746
0747
0748
0749
0750
0751
0752
0753
0754
0755
0756
0757
0758
0759
0760
0761
0762
0763
0764
0765
0766
0767
0768
0769
0770
0771
0772
0773 #if defined(Py_REF_DEBUG) && !defined(Py_LIMITED_API)
0774 PyAPI_FUNC(void) _Py_NegativeRefcount(const char *filename, int lineno,
0775 PyObject *op);
0776 PyAPI_FUNC(void) _Py_INCREF_IncRefTotal(void);
0777 PyAPI_FUNC(void) _Py_DECREF_DecRefTotal(void);
0778 #endif
0779
0780 PyAPI_FUNC(void) _Py_Dealloc(PyObject *);
0781
0782
0783
0784
0785
0786 PyAPI_FUNC(void) Py_IncRef(PyObject *);
0787 PyAPI_FUNC(void) Py_DecRef(PyObject *);
0788
0789
0790
0791 PyAPI_FUNC(void) _Py_IncRef(PyObject *);
0792 PyAPI_FUNC(void) _Py_DecRef(PyObject *);
0793
0794 static inline Py_ALWAYS_INLINE void Py_INCREF(PyObject *op)
0795 {
0796 #if defined(Py_LIMITED_API) && (Py_LIMITED_API+0 >= 0x030c0000 || defined(Py_REF_DEBUG))
0797
0798
0799
0800
0801 # if Py_LIMITED_API+0 >= 0x030a00A7
0802 _Py_IncRef(op);
0803 # else
0804 Py_IncRef(op);
0805 # endif
0806 #else
0807
0808
0809 #if defined(Py_GIL_DISABLED)
0810 uint32_t local = _Py_atomic_load_uint32_relaxed(&op->ob_ref_local);
0811 uint32_t new_local = local + 1;
0812 if (new_local == 0) {
0813
0814 return;
0815 }
0816 if (_Py_IsOwnedByCurrentThread(op)) {
0817 _Py_atomic_store_uint32_relaxed(&op->ob_ref_local, new_local);
0818 }
0819 else {
0820 _Py_atomic_add_ssize(&op->ob_ref_shared, (1 << _Py_REF_SHARED_SHIFT));
0821 }
0822 #elif SIZEOF_VOID_P > 4
0823
0824 PY_UINT32_T cur_refcnt = op->ob_refcnt_split[PY_BIG_ENDIAN];
0825 PY_UINT32_T new_refcnt = cur_refcnt + 1;
0826 if (new_refcnt == 0) {
0827
0828
0829 return;
0830 }
0831 op->ob_refcnt_split[PY_BIG_ENDIAN] = new_refcnt;
0832 #else
0833
0834 if (_Py_IsImmortal(op)) {
0835 return;
0836 }
0837 op->ob_refcnt++;
0838 #endif
0839 _Py_INCREF_STAT_INC();
0840 #ifdef Py_REF_DEBUG
0841 _Py_INCREF_IncRefTotal();
0842 #endif
0843 #endif
0844 }
0845 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000
0846 # define Py_INCREF(op) Py_INCREF(_PyObject_CAST(op))
0847 #endif
0848
0849
0850 #if !defined(Py_LIMITED_API) && defined(Py_GIL_DISABLED)
0851
0852 PyAPI_FUNC(void) _Py_DecRefShared(PyObject *);
0853 PyAPI_FUNC(void) _Py_DecRefSharedDebug(PyObject *, const char *, int);
0854
0855
0856
0857
0858
0859 PyAPI_FUNC(void) _Py_MergeZeroLocalRefcount(PyObject *);
0860 #endif
0861
0862 #if defined(Py_LIMITED_API) && (Py_LIMITED_API+0 >= 0x030c0000 || defined(Py_REF_DEBUG))
0863
0864
0865
0866
0867 static inline void Py_DECREF(PyObject *op) {
0868 # if Py_LIMITED_API+0 >= 0x030a00A7
0869 _Py_DecRef(op);
0870 # else
0871 Py_DecRef(op);
0872 # endif
0873 }
0874 #define Py_DECREF(op) Py_DECREF(_PyObject_CAST(op))
0875
0876 #elif defined(Py_GIL_DISABLED) && defined(Py_REF_DEBUG)
0877 static inline void Py_DECREF(const char *filename, int lineno, PyObject *op)
0878 {
0879 uint32_t local = _Py_atomic_load_uint32_relaxed(&op->ob_ref_local);
0880 if (local == _Py_IMMORTAL_REFCNT_LOCAL) {
0881 return;
0882 }
0883 _Py_DECREF_STAT_INC();
0884 _Py_DECREF_DecRefTotal();
0885 if (_Py_IsOwnedByCurrentThread(op)) {
0886 if (local == 0) {
0887 _Py_NegativeRefcount(filename, lineno, op);
0888 }
0889 local--;
0890 _Py_atomic_store_uint32_relaxed(&op->ob_ref_local, local);
0891 if (local == 0) {
0892 _Py_MergeZeroLocalRefcount(op);
0893 }
0894 }
0895 else {
0896 _Py_DecRefSharedDebug(op, filename, lineno);
0897 }
0898 }
0899 #define Py_DECREF(op) Py_DECREF(__FILE__, __LINE__, _PyObject_CAST(op))
0900
0901 #elif defined(Py_GIL_DISABLED)
0902 static inline void Py_DECREF(PyObject *op)
0903 {
0904 uint32_t local = _Py_atomic_load_uint32_relaxed(&op->ob_ref_local);
0905 if (local == _Py_IMMORTAL_REFCNT_LOCAL) {
0906 return;
0907 }
0908 _Py_DECREF_STAT_INC();
0909 if (_Py_IsOwnedByCurrentThread(op)) {
0910 local--;
0911 _Py_atomic_store_uint32_relaxed(&op->ob_ref_local, local);
0912 if (local == 0) {
0913 _Py_MergeZeroLocalRefcount(op);
0914 }
0915 }
0916 else {
0917 _Py_DecRefShared(op);
0918 }
0919 }
0920 #define Py_DECREF(op) Py_DECREF(_PyObject_CAST(op))
0921
0922 #elif defined(Py_REF_DEBUG)
0923 static inline void Py_DECREF(const char *filename, int lineno, PyObject *op)
0924 {
0925 if (op->ob_refcnt <= 0) {
0926 _Py_NegativeRefcount(filename, lineno, op);
0927 }
0928 if (_Py_IsImmortal(op)) {
0929 return;
0930 }
0931 _Py_DECREF_STAT_INC();
0932 _Py_DECREF_DecRefTotal();
0933 if (--op->ob_refcnt == 0) {
0934 _Py_Dealloc(op);
0935 }
0936 }
0937 #define Py_DECREF(op) Py_DECREF(__FILE__, __LINE__, _PyObject_CAST(op))
0938
0939 #else
0940 static inline Py_ALWAYS_INLINE void Py_DECREF(PyObject *op)
0941 {
0942
0943
0944 if (_Py_IsImmortal(op)) {
0945 return;
0946 }
0947 _Py_DECREF_STAT_INC();
0948 if (--op->ob_refcnt == 0) {
0949 _Py_Dealloc(op);
0950 }
0951 }
0952 #define Py_DECREF(op) Py_DECREF(_PyObject_CAST(op))
0953 #endif
0954
0955
0956
0957
0958
0959
0960
0961
0962
0963
0964
0965
0966
0967
0968
0969
0970
0971
0972
0973
0974
0975
0976
0977
0978
0979
0980
0981
0982
0983
0984
0985
0986
0987
0988
0989
0990
0991
0992
0993
0994
0995
0996
0997
0998
0999
1000
1001
1002
1003
1004 #ifdef _Py_TYPEOF
1005 #define Py_CLEAR(op) \
1006 do { \
1007 _Py_TYPEOF(op)* _tmp_op_ptr = &(op); \
1008 _Py_TYPEOF(op) _tmp_old_op = (*_tmp_op_ptr); \
1009 if (_tmp_old_op != NULL) { \
1010 *_tmp_op_ptr = _Py_NULL; \
1011 Py_DECREF(_tmp_old_op); \
1012 } \
1013 } while (0)
1014 #else
1015 #define Py_CLEAR(op) \
1016 do { \
1017 PyObject **_tmp_op_ptr = _Py_CAST(PyObject**, &(op)); \
1018 PyObject *_tmp_old_op = (*_tmp_op_ptr); \
1019 if (_tmp_old_op != NULL) { \
1020 PyObject *_null_ptr = _Py_NULL; \
1021 memcpy(_tmp_op_ptr, &_null_ptr, sizeof(PyObject*)); \
1022 Py_DECREF(_tmp_old_op); \
1023 } \
1024 } while (0)
1025 #endif
1026
1027
1028
1029 static inline void Py_XINCREF(PyObject *op)
1030 {
1031 if (op != _Py_NULL) {
1032 Py_INCREF(op);
1033 }
1034 }
1035 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000
1036 # define Py_XINCREF(op) Py_XINCREF(_PyObject_CAST(op))
1037 #endif
1038
1039 static inline void Py_XDECREF(PyObject *op)
1040 {
1041 if (op != _Py_NULL) {
1042 Py_DECREF(op);
1043 }
1044 }
1045 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000
1046 # define Py_XDECREF(op) Py_XDECREF(_PyObject_CAST(op))
1047 #endif
1048
1049
1050
1051 PyAPI_FUNC(PyObject*) Py_NewRef(PyObject *obj);
1052
1053
1054 PyAPI_FUNC(PyObject*) Py_XNewRef(PyObject *obj);
1055
1056 static inline PyObject* _Py_NewRef(PyObject *obj)
1057 {
1058 Py_INCREF(obj);
1059 return obj;
1060 }
1061
1062 static inline PyObject* _Py_XNewRef(PyObject *obj)
1063 {
1064 Py_XINCREF(obj);
1065 return obj;
1066 }
1067
1068
1069
1070
1071 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000
1072 # define Py_NewRef(obj) _Py_NewRef(_PyObject_CAST(obj))
1073 # define Py_XNewRef(obj) _Py_XNewRef(_PyObject_CAST(obj))
1074 #else
1075 # define Py_NewRef(obj) _Py_NewRef(obj)
1076 # define Py_XNewRef(obj) _Py_XNewRef(obj)
1077 #endif
1078
1079
1080 #define Py_CONSTANT_NONE 0
1081 #define Py_CONSTANT_FALSE 1
1082 #define Py_CONSTANT_TRUE 2
1083 #define Py_CONSTANT_ELLIPSIS 3
1084 #define Py_CONSTANT_NOT_IMPLEMENTED 4
1085 #define Py_CONSTANT_ZERO 5
1086 #define Py_CONSTANT_ONE 6
1087 #define Py_CONSTANT_EMPTY_STR 7
1088 #define Py_CONSTANT_EMPTY_BYTES 8
1089 #define Py_CONSTANT_EMPTY_TUPLE 9
1090
1091 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030d0000
1092 PyAPI_FUNC(PyObject*) Py_GetConstant(unsigned int constant_id);
1093 PyAPI_FUNC(PyObject*) Py_GetConstantBorrowed(unsigned int constant_id);
1094 #endif
1095
1096
1097
1098
1099
1100
1101 PyAPI_DATA(PyObject) _Py_NoneStruct;
1102
1103 #if defined(Py_LIMITED_API) && Py_LIMITED_API+0 >= 0x030D0000
1104 # define Py_None Py_GetConstantBorrowed(Py_CONSTANT_NONE)
1105 #else
1106 # define Py_None (&_Py_NoneStruct)
1107 #endif
1108
1109
1110 PyAPI_FUNC(int) Py_IsNone(PyObject *x);
1111 #define Py_IsNone(x) Py_Is((x), Py_None)
1112
1113
1114
1115 #if defined(Py_LIMITED_API) && Py_LIMITED_API+0 < 0x030c0000
1116 # define Py_RETURN_NONE return Py_NewRef(Py_None)
1117 #else
1118 # define Py_RETURN_NONE return Py_None
1119 #endif
1120
1121
1122
1123
1124
1125 PyAPI_DATA(PyObject) _Py_NotImplementedStruct;
1126
1127 #if defined(Py_LIMITED_API) && Py_LIMITED_API+0 >= 0x030D0000
1128 # define Py_NotImplemented Py_GetConstantBorrowed(Py_CONSTANT_NOT_IMPLEMENTED)
1129 #else
1130 # define Py_NotImplemented (&_Py_NotImplementedStruct)
1131 #endif
1132
1133
1134 #define Py_RETURN_NOTIMPLEMENTED return Py_NotImplemented
1135
1136
1137 #define Py_LT 0
1138 #define Py_LE 1
1139 #define Py_EQ 2
1140 #define Py_NE 3
1141 #define Py_GT 4
1142 #define Py_GE 5
1143
1144 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030A0000
1145
1146 typedef enum {
1147 PYGEN_RETURN = 0,
1148 PYGEN_ERROR = -1,
1149 PYGEN_NEXT = 1,
1150 } PySendResult;
1151 #endif
1152
1153
1154
1155
1156
1157
1158 #define Py_RETURN_RICHCOMPARE(val1, val2, op) \
1159 do { \
1160 switch (op) { \
1161 case Py_EQ: if ((val1) == (val2)) Py_RETURN_TRUE; Py_RETURN_FALSE; \
1162 case Py_NE: if ((val1) != (val2)) Py_RETURN_TRUE; Py_RETURN_FALSE; \
1163 case Py_LT: if ((val1) < (val2)) Py_RETURN_TRUE; Py_RETURN_FALSE; \
1164 case Py_GT: if ((val1) > (val2)) Py_RETURN_TRUE; Py_RETURN_FALSE; \
1165 case Py_LE: if ((val1) <= (val2)) Py_RETURN_TRUE; Py_RETURN_FALSE; \
1166 case Py_GE: if ((val1) >= (val2)) Py_RETURN_TRUE; Py_RETURN_FALSE; \
1167 default: \
1168 Py_UNREACHABLE(); \
1169 } \
1170 } while (0)
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225 #ifndef Py_LIMITED_API
1226 # define Py_CPYTHON_OBJECT_H
1227 # include "cpython/object.h"
1228 # undef Py_CPYTHON_OBJECT_H
1229 #endif
1230
1231
1232 static inline int
1233 PyType_HasFeature(PyTypeObject *type, unsigned long feature)
1234 {
1235 unsigned long flags;
1236 #ifdef Py_LIMITED_API
1237
1238 flags = PyType_GetFlags(type);
1239 #else
1240 # ifdef Py_GIL_DISABLED
1241 flags = _Py_atomic_load_ulong_relaxed(&type->tp_flags);
1242 # else
1243 flags = type->tp_flags;
1244 # endif
1245 #endif
1246 return ((flags & feature) != 0);
1247 }
1248
1249 #define PyType_FastSubclass(type, flag) PyType_HasFeature((type), (flag))
1250
1251 static inline int PyType_Check(PyObject *op) {
1252 return PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_TYPE_SUBCLASS);
1253 }
1254 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000
1255 # define PyType_Check(op) PyType_Check(_PyObject_CAST(op))
1256 #endif
1257
1258 #define _PyType_CAST(op) \
1259 (assert(PyType_Check(op)), _Py_CAST(PyTypeObject*, (op)))
1260
1261 static inline int PyType_CheckExact(PyObject *op) {
1262 return Py_IS_TYPE(op, &PyType_Type);
1263 }
1264 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000
1265 # define PyType_CheckExact(op) PyType_CheckExact(_PyObject_CAST(op))
1266 #endif
1267
1268 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030d0000
1269 PyAPI_FUNC(PyObject *) PyType_GetModuleByDef(PyTypeObject *, PyModuleDef *);
1270 #endif
1271
1272 #ifdef __cplusplus
1273 }
1274 #endif
1275 #endif