| #ifndef Py_OBJECT_H |
| #define Py_OBJECT_H |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
|
|
|
|
| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| |
| #if defined(Py_DEBUG) && !defined(Py_REF_DEBUG) |
| # define Py_REF_DEBUG |
| #endif |
|
|
| |
| #define PyObject_HEAD PyObject ob_base; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #if SIZEOF_VOID_P > 4 |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| #define _Py_IMMORTAL_REFCNT _Py_CAST(Py_ssize_t, UINT_MAX) |
|
|
| #else |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| #define _Py_IMMORTAL_REFCNT _Py_CAST(Py_ssize_t, UINT_MAX >> 2) |
| #endif |
|
|
| |
| |
| #ifdef Py_GIL_DISABLED |
| #define _Py_IMMORTAL_REFCNT_LOCAL UINT32_MAX |
| #endif |
|
|
| |
| #define _PyObject_EXTRA_INIT |
|
|
| |
| |
| |
| |
| |
| #if defined(Py_GIL_DISABLED) |
| #define PyObject_HEAD_INIT(type) \ |
| { \ |
| 0, \ |
| 0, \ |
| { 0 }, \ |
| 0, \ |
| _Py_IMMORTAL_REFCNT_LOCAL, \ |
| 0, \ |
| (type), \ |
| }, |
| #else |
| #define PyObject_HEAD_INIT(type) \ |
| { \ |
| { _Py_IMMORTAL_REFCNT }, \ |
| (type) \ |
| }, |
| #endif |
|
|
| #define PyVarObject_HEAD_INIT(type, size) \ |
| { \ |
| PyObject_HEAD_INIT(type) \ |
| (size) \ |
| }, |
|
|
| |
| |
| |
| |
| |
| |
| #define PyObject_VAR_HEAD PyVarObject ob_base; |
| #define Py_INVALID_SIZE (Py_ssize_t)-1 |
|
|
| |
| |
| |
| |
| |
| #ifndef Py_GIL_DISABLED |
| struct _object { |
| #if (defined(__GNUC__) || defined(__clang__)) \ |
| && !(defined __STDC_VERSION__ && __STDC_VERSION__ >= 201112L) |
| |
| __extension__ |
| #endif |
| #ifdef _MSC_VER |
| |
| |
| __pragma(warning(push)) |
| __pragma(warning(disable: 4201)) |
| #endif |
| union { |
| Py_ssize_t ob_refcnt; |
| #if SIZEOF_VOID_P > 4 |
| PY_UINT32_T ob_refcnt_split[2]; |
| #endif |
| }; |
| #ifdef _MSC_VER |
| __pragma(warning(pop)) |
| #endif |
|
|
| PyTypeObject *ob_type; |
| }; |
| #else |
| |
| |
| |
| #define _Py_UNOWNED_TID 0 |
|
|
| |
| |
| #define _Py_REF_SHARED_SHIFT 2 |
| #define _Py_REF_SHARED_FLAG_MASK 0x3 |
|
|
| |
| #define _Py_REF_SHARED_INIT 0x0 |
| #define _Py_REF_MAYBE_WEAKREF 0x1 |
| #define _Py_REF_QUEUED 0x2 |
| #define _Py_REF_MERGED 0x3 |
|
|
| |
| #define _Py_REF_SHARED(refcnt, flags) (((refcnt) << _Py_REF_SHARED_SHIFT) + (flags)) |
|
|
| struct _object { |
| |
| |
| |
| uintptr_t ob_tid; |
| uint16_t _padding; |
| PyMutex ob_mutex; |
| uint8_t ob_gc_bits; |
| uint32_t ob_ref_local; |
| Py_ssize_t ob_ref_shared; |
| PyTypeObject *ob_type; |
| }; |
| #endif |
|
|
| |
| #define _PyObject_CAST(op) _Py_CAST(PyObject*, (op)) |
|
|
| typedef struct { |
| PyObject ob_base; |
| Py_ssize_t ob_size; |
| } PyVarObject; |
|
|
| |
| #define _PyVarObject_CAST(op) _Py_CAST(PyVarObject*, (op)) |
|
|
|
|
| |
| PyAPI_FUNC(int) Py_Is(PyObject *x, PyObject *y); |
| #define Py_Is(x, y) ((x) == (y)) |
|
|
| #if defined(Py_GIL_DISABLED) && !defined(Py_LIMITED_API) |
| PyAPI_FUNC(uintptr_t) _Py_GetThreadLocal_Addr(void); |
|
|
| static inline uintptr_t |
| _Py_ThreadId(void) |
| { |
| uintptr_t tid; |
| #if defined(_MSC_VER) && defined(_M_X64) |
| tid = __readgsqword(48); |
| #elif defined(_MSC_VER) && defined(_M_IX86) |
| tid = __readfsdword(24); |
| #elif defined(_MSC_VER) && defined(_M_ARM64) |
| tid = __getReg(18); |
| #elif defined(__MINGW32__) && defined(_M_X64) |
| tid = __readgsqword(48); |
| #elif defined(__MINGW32__) && defined(_M_IX86) |
| tid = __readfsdword(24); |
| #elif defined(__MINGW32__) && defined(_M_ARM64) |
| tid = __getReg(18); |
| #elif defined(__i386__) |
| __asm__("movl %%gs:0, %0" : "=r" (tid)); |
| #elif defined(__MACH__) && defined(__x86_64__) |
| __asm__("movq %%gs:0, %0" : "=r" (tid)); |
| #elif defined(__x86_64__) |
| __asm__("movq %%fs:0, %0" : "=r" (tid)); |
| #elif defined(__arm__) && __ARM_ARCH >= 7 |
| __asm__ ("mrc p15, 0, %0, c13, c0, 3\nbic %0, %0, #3" : "=r" (tid)); |
| #elif defined(__aarch64__) && defined(__APPLE__) |
| __asm__ ("mrs %0, tpidrro_el0" : "=r" (tid)); |
| #elif defined(__aarch64__) |
| __asm__ ("mrs %0, tpidr_el0" : "=r" (tid)); |
| #elif defined(__powerpc64__) |
| #if defined(__clang__) && _Py__has_builtin(__builtin_thread_pointer) |
| tid = (uintptr_t)__builtin_thread_pointer(); |
| #else |
| |
| register uintptr_t tp __asm__ ("r13"); |
| __asm__("" : "=r" (tp)); |
| tid = tp; |
| #endif |
| #elif defined(__powerpc__) |
| #if defined(__clang__) && _Py__has_builtin(__builtin_thread_pointer) |
| tid = (uintptr_t)__builtin_thread_pointer(); |
| #else |
| |
| register uintptr_t tp __asm__ ("r2"); |
| __asm__ ("" : "=r" (tp)); |
| tid = tp; |
| #endif |
| #elif defined(__s390__) && defined(__GNUC__) |
| |
| |
| tid = (uintptr_t)__builtin_thread_pointer(); |
| #elif defined(__riscv) |
| #if defined(__clang__) && _Py__has_builtin(__builtin_thread_pointer) |
| tid = (uintptr_t)__builtin_thread_pointer(); |
| #else |
| |
| __asm__ ("mv %0, tp" : "=r" (tid)); |
| #endif |
| #else |
| |
| |
| tid = _Py_GetThreadLocal_Addr(); |
| #endif |
| return tid; |
| } |
|
|
| static inline Py_ALWAYS_INLINE int |
| _Py_IsOwnedByCurrentThread(PyObject *ob) |
| { |
| #ifdef _Py_THREAD_SANITIZER |
| return _Py_atomic_load_uintptr_relaxed(&ob->ob_tid) == _Py_ThreadId(); |
| #else |
| return ob->ob_tid == _Py_ThreadId(); |
| #endif |
| } |
| #endif |
|
|
| static inline Py_ssize_t Py_REFCNT(PyObject *ob) { |
| #if !defined(Py_GIL_DISABLED) |
| return ob->ob_refcnt; |
| #else |
| uint32_t local = _Py_atomic_load_uint32_relaxed(&ob->ob_ref_local); |
| if (local == _Py_IMMORTAL_REFCNT_LOCAL) { |
| return _Py_IMMORTAL_REFCNT; |
| } |
| Py_ssize_t shared = _Py_atomic_load_ssize_relaxed(&ob->ob_ref_shared); |
| return _Py_STATIC_CAST(Py_ssize_t, local) + |
| Py_ARITHMETIC_RIGHT_SHIFT(Py_ssize_t, shared, _Py_REF_SHARED_SHIFT); |
| #endif |
| } |
| #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 |
| # define Py_REFCNT(ob) Py_REFCNT(_PyObject_CAST(ob)) |
| #endif |
|
|
|
|
| |
| static inline PyTypeObject* Py_TYPE(PyObject *ob) { |
| return ob->ob_type; |
| } |
| #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 |
| # define Py_TYPE(ob) Py_TYPE(_PyObject_CAST(ob)) |
| #endif |
|
|
| PyAPI_DATA(PyTypeObject) PyLong_Type; |
| PyAPI_DATA(PyTypeObject) PyBool_Type; |
|
|
| |
| static inline Py_ssize_t Py_SIZE(PyObject *ob) { |
| assert(ob->ob_type != &PyLong_Type); |
| assert(ob->ob_type != &PyBool_Type); |
| return _PyVarObject_CAST(ob)->ob_size; |
| } |
| #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 |
| # define Py_SIZE(ob) Py_SIZE(_PyObject_CAST(ob)) |
| #endif |
|
|
| static inline Py_ALWAYS_INLINE int _Py_IsImmortal(PyObject *op) |
| { |
| #if defined(Py_GIL_DISABLED) |
| return (_Py_atomic_load_uint32_relaxed(&op->ob_ref_local) == |
| _Py_IMMORTAL_REFCNT_LOCAL); |
| #elif SIZEOF_VOID_P > 4 |
| return (_Py_CAST(PY_INT32_T, op->ob_refcnt) < 0); |
| #else |
| return (op->ob_refcnt == _Py_IMMORTAL_REFCNT); |
| #endif |
| } |
| #define _Py_IsImmortal(op) _Py_IsImmortal(_PyObject_CAST(op)) |
|
|
| static inline int Py_IS_TYPE(PyObject *ob, PyTypeObject *type) { |
| return Py_TYPE(ob) == type; |
| } |
| #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 |
| # define Py_IS_TYPE(ob, type) Py_IS_TYPE(_PyObject_CAST(ob), (type)) |
| #endif |
|
|
|
|
| |
| PyAPI_FUNC(void) _Py_SetRefcnt(PyObject *ob, Py_ssize_t refcnt); |
|
|
| static inline void Py_SET_REFCNT(PyObject *ob, Py_ssize_t refcnt) { |
| #if defined(Py_LIMITED_API) && Py_LIMITED_API+0 >= 0x030d0000 |
| |
| |
| _Py_SetRefcnt(ob, refcnt); |
| #else |
| |
| |
| |
| |
| if (_Py_IsImmortal(ob)) { |
| return; |
| } |
|
|
| #ifndef Py_GIL_DISABLED |
| ob->ob_refcnt = refcnt; |
| #else |
| if (_Py_IsOwnedByCurrentThread(ob)) { |
| if ((size_t)refcnt > (size_t)UINT32_MAX) { |
| |
| ob->ob_tid = _Py_UNOWNED_TID; |
| ob->ob_ref_local = _Py_IMMORTAL_REFCNT_LOCAL; |
| ob->ob_ref_shared = 0; |
| } |
| else { |
| |
| |
| ob->ob_ref_local = _Py_STATIC_CAST(uint32_t, refcnt); |
| ob->ob_ref_shared &= _Py_REF_SHARED_FLAG_MASK; |
| } |
| } |
| else { |
| |
| |
| ob->ob_tid = _Py_UNOWNED_TID; |
| ob->ob_ref_local = 0; |
| ob->ob_ref_shared = _Py_REF_SHARED(refcnt, _Py_REF_MERGED); |
| } |
| #endif |
| #endif |
| } |
| #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 |
| # define Py_SET_REFCNT(ob, refcnt) Py_SET_REFCNT(_PyObject_CAST(ob), (refcnt)) |
| #endif |
|
|
|
|
| static inline void Py_SET_TYPE(PyObject *ob, PyTypeObject *type) { |
| ob->ob_type = type; |
| } |
| #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 |
| # define Py_SET_TYPE(ob, type) Py_SET_TYPE(_PyObject_CAST(ob), type) |
| #endif |
|
|
| static inline void Py_SET_SIZE(PyVarObject *ob, Py_ssize_t size) { |
| assert(ob->ob_base.ob_type != &PyLong_Type); |
| assert(ob->ob_base.ob_type != &PyBool_Type); |
| #ifdef Py_GIL_DISABLED |
| _Py_atomic_store_ssize_relaxed(&ob->ob_size, size); |
| #else |
| ob->ob_size = size; |
| #endif |
| } |
| #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 |
| # define Py_SET_SIZE(ob, size) Py_SET_SIZE(_PyVarObject_CAST(ob), (size)) |
| #endif |
|
|
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| typedef PyObject * (*unaryfunc)(PyObject *); |
| typedef PyObject * (*binaryfunc)(PyObject *, PyObject *); |
| typedef PyObject * (*ternaryfunc)(PyObject *, PyObject *, PyObject *); |
| typedef int (*inquiry)(PyObject *); |
| typedef Py_ssize_t (*lenfunc)(PyObject *); |
| typedef PyObject *(*ssizeargfunc)(PyObject *, Py_ssize_t); |
| typedef PyObject *(*ssizessizeargfunc)(PyObject *, Py_ssize_t, Py_ssize_t); |
| typedef int(*ssizeobjargproc)(PyObject *, Py_ssize_t, PyObject *); |
| typedef int(*ssizessizeobjargproc)(PyObject *, Py_ssize_t, Py_ssize_t, PyObject *); |
| typedef int(*objobjargproc)(PyObject *, PyObject *, PyObject *); |
|
|
| typedef int (*objobjproc)(PyObject *, PyObject *); |
| typedef int (*visitproc)(PyObject *, void *); |
| typedef int (*traverseproc)(PyObject *, visitproc, void *); |
|
|
|
|
| typedef void (*freefunc)(void *); |
| typedef void (*destructor)(PyObject *); |
| typedef PyObject *(*getattrfunc)(PyObject *, char *); |
| typedef PyObject *(*getattrofunc)(PyObject *, PyObject *); |
| typedef int (*setattrfunc)(PyObject *, char *, PyObject *); |
| typedef int (*setattrofunc)(PyObject *, PyObject *, PyObject *); |
| typedef PyObject *(*reprfunc)(PyObject *); |
| typedef Py_hash_t (*hashfunc)(PyObject *); |
| typedef PyObject *(*richcmpfunc) (PyObject *, PyObject *, int); |
| typedef PyObject *(*getiterfunc) (PyObject *); |
| typedef PyObject *(*iternextfunc) (PyObject *); |
| typedef PyObject *(*descrgetfunc) (PyObject *, PyObject *, PyObject *); |
| typedef int (*descrsetfunc) (PyObject *, PyObject *, PyObject *); |
| typedef int (*initproc)(PyObject *, PyObject *, PyObject *); |
| typedef PyObject *(*newfunc)(PyTypeObject *, PyObject *, PyObject *); |
| typedef PyObject *(*allocfunc)(PyTypeObject *, Py_ssize_t); |
|
|
| #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030c0000 |
| typedef PyObject *(*vectorcallfunc)(PyObject *callable, PyObject *const *args, |
| size_t nargsf, PyObject *kwnames); |
| #endif |
|
|
| typedef struct{ |
| int slot; |
| void *pfunc; |
| } PyType_Slot; |
|
|
| typedef struct{ |
| const char* name; |
| int basicsize; |
| int itemsize; |
| unsigned int flags; |
| PyType_Slot *slots; |
| } PyType_Spec; |
|
|
| PyAPI_FUNC(PyObject*) PyType_FromSpec(PyType_Spec*); |
| #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 |
| PyAPI_FUNC(PyObject*) PyType_FromSpecWithBases(PyType_Spec*, PyObject*); |
| #endif |
| #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03040000 |
| PyAPI_FUNC(void*) PyType_GetSlot(PyTypeObject*, int); |
| #endif |
| #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03090000 |
| PyAPI_FUNC(PyObject*) PyType_FromModuleAndSpec(PyObject *, PyType_Spec *, PyObject *); |
| PyAPI_FUNC(PyObject *) PyType_GetModule(PyTypeObject *); |
| PyAPI_FUNC(void *) PyType_GetModuleState(PyTypeObject *); |
| #endif |
| #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030B0000 |
| PyAPI_FUNC(PyObject *) PyType_GetName(PyTypeObject *); |
| PyAPI_FUNC(PyObject *) PyType_GetQualName(PyTypeObject *); |
| #endif |
| #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030D0000 |
| PyAPI_FUNC(PyObject *) PyType_GetFullyQualifiedName(PyTypeObject *type); |
| PyAPI_FUNC(PyObject *) PyType_GetModuleName(PyTypeObject *type); |
| #endif |
| #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030C0000 |
| PyAPI_FUNC(PyObject *) PyType_FromMetaclass(PyTypeObject*, PyObject*, PyType_Spec*, PyObject*); |
| PyAPI_FUNC(void *) PyObject_GetTypeData(PyObject *obj, PyTypeObject *cls); |
| PyAPI_FUNC(Py_ssize_t) PyType_GetTypeDataSize(PyTypeObject *cls); |
| #endif |
|
|
| |
| PyAPI_FUNC(int) PyType_IsSubtype(PyTypeObject *, PyTypeObject *); |
|
|
| static inline int PyObject_TypeCheck(PyObject *ob, PyTypeObject *type) { |
| return Py_IS_TYPE(ob, type) || PyType_IsSubtype(Py_TYPE(ob), type); |
| } |
| #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 |
| # define PyObject_TypeCheck(ob, type) PyObject_TypeCheck(_PyObject_CAST(ob), (type)) |
| #endif |
|
|
| PyAPI_DATA(PyTypeObject) PyType_Type; |
| PyAPI_DATA(PyTypeObject) PyBaseObject_Type; |
| PyAPI_DATA(PyTypeObject) PySuper_Type; |
|
|
| PyAPI_FUNC(unsigned long) PyType_GetFlags(PyTypeObject*); |
|
|
| PyAPI_FUNC(int) PyType_Ready(PyTypeObject *); |
| PyAPI_FUNC(PyObject *) PyType_GenericAlloc(PyTypeObject *, Py_ssize_t); |
| PyAPI_FUNC(PyObject *) PyType_GenericNew(PyTypeObject *, |
| PyObject *, PyObject *); |
| PyAPI_FUNC(unsigned int) PyType_ClearCache(void); |
| PyAPI_FUNC(void) PyType_Modified(PyTypeObject *); |
|
|
| |
| PyAPI_FUNC(PyObject *) PyObject_Repr(PyObject *); |
| PyAPI_FUNC(PyObject *) PyObject_Str(PyObject *); |
| PyAPI_FUNC(PyObject *) PyObject_ASCII(PyObject *); |
| PyAPI_FUNC(PyObject *) PyObject_Bytes(PyObject *); |
| PyAPI_FUNC(PyObject *) PyObject_RichCompare(PyObject *, PyObject *, int); |
| PyAPI_FUNC(int) PyObject_RichCompareBool(PyObject *, PyObject *, int); |
| PyAPI_FUNC(PyObject *) PyObject_GetAttrString(PyObject *, const char *); |
| PyAPI_FUNC(int) PyObject_SetAttrString(PyObject *, const char *, PyObject *); |
| PyAPI_FUNC(int) PyObject_DelAttrString(PyObject *v, const char *name); |
| PyAPI_FUNC(int) PyObject_HasAttrString(PyObject *, const char *); |
| PyAPI_FUNC(PyObject *) PyObject_GetAttr(PyObject *, PyObject *); |
| #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030d0000 |
| PyAPI_FUNC(int) PyObject_GetOptionalAttr(PyObject *, PyObject *, PyObject **); |
| PyAPI_FUNC(int) PyObject_GetOptionalAttrString(PyObject *, const char *, PyObject **); |
| #endif |
| PyAPI_FUNC(int) PyObject_SetAttr(PyObject *, PyObject *, PyObject *); |
| PyAPI_FUNC(int) PyObject_DelAttr(PyObject *v, PyObject *name); |
| PyAPI_FUNC(int) PyObject_HasAttr(PyObject *, PyObject *); |
| #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030d0000 |
| PyAPI_FUNC(int) PyObject_HasAttrWithError(PyObject *, PyObject *); |
| PyAPI_FUNC(int) PyObject_HasAttrStringWithError(PyObject *, const char *); |
| #endif |
| PyAPI_FUNC(PyObject *) PyObject_SelfIter(PyObject *); |
| PyAPI_FUNC(PyObject *) PyObject_GenericGetAttr(PyObject *, PyObject *); |
| PyAPI_FUNC(int) PyObject_GenericSetAttr(PyObject *, PyObject *, PyObject *); |
| #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 |
| PyAPI_FUNC(int) PyObject_GenericSetDict(PyObject *, PyObject *, void *); |
| #endif |
| PyAPI_FUNC(Py_hash_t) PyObject_Hash(PyObject *); |
| PyAPI_FUNC(Py_hash_t) PyObject_HashNotImplemented(PyObject *); |
| PyAPI_FUNC(int) PyObject_IsTrue(PyObject *); |
| PyAPI_FUNC(int) PyObject_Not(PyObject *); |
| PyAPI_FUNC(int) PyCallable_Check(PyObject *); |
| PyAPI_FUNC(void) PyObject_ClearWeakRefs(PyObject *); |
|
|
| |
| |
| |
| |
| |
| PyAPI_FUNC(PyObject *) PyObject_Dir(PyObject *); |
|
|
| |
| PyAPI_FUNC(int) Py_ReprEnter(PyObject *); |
| PyAPI_FUNC(void) Py_ReprLeave(PyObject *); |
|
|
| |
| #define Py_PRINT_RAW 1 |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #ifndef Py_LIMITED_API |
|
|
| |
| #define _Py_TPFLAGS_STATIC_BUILTIN (1 << 1) |
|
|
| |
| |
| |
| #define Py_TPFLAGS_INLINE_VALUES (1 << 2) |
|
|
| |
| |
| |
| #define Py_TPFLAGS_MANAGED_WEAKREF (1 << 3) |
|
|
| |
| |
| |
| #define Py_TPFLAGS_MANAGED_DICT (1 << 4) |
|
|
| #define Py_TPFLAGS_PREHEADER (Py_TPFLAGS_MANAGED_WEAKREF | Py_TPFLAGS_MANAGED_DICT) |
|
|
| |
| #define Py_TPFLAGS_SEQUENCE (1 << 5) |
| |
| #define Py_TPFLAGS_MAPPING (1 << 6) |
| #endif |
|
|
| |
| |
| #define Py_TPFLAGS_DISALLOW_INSTANTIATION (1UL << 7) |
|
|
| |
| #define Py_TPFLAGS_IMMUTABLETYPE (1UL << 8) |
|
|
| |
| #define Py_TPFLAGS_HEAPTYPE (1UL << 9) |
|
|
| |
| #define Py_TPFLAGS_BASETYPE (1UL << 10) |
|
|
| |
| #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030C0000 |
| #define Py_TPFLAGS_HAVE_VECTORCALL (1UL << 11) |
| #ifndef Py_LIMITED_API |
| |
| #define _Py_TPFLAGS_HAVE_VECTORCALL Py_TPFLAGS_HAVE_VECTORCALL |
| #endif |
| #endif |
|
|
| |
| #define Py_TPFLAGS_READY (1UL << 12) |
|
|
| |
| #define Py_TPFLAGS_READYING (1UL << 13) |
|
|
| |
| #define Py_TPFLAGS_HAVE_GC (1UL << 14) |
|
|
| |
| #ifdef STACKLESS |
| #define Py_TPFLAGS_HAVE_STACKLESS_EXTENSION (3UL << 15) |
| #else |
| #define Py_TPFLAGS_HAVE_STACKLESS_EXTENSION 0 |
| #endif |
|
|
| |
| #define Py_TPFLAGS_METHOD_DESCRIPTOR (1UL << 17) |
|
|
| |
| #define Py_TPFLAGS_VALID_VERSION_TAG (1UL << 19) |
|
|
| |
| #define Py_TPFLAGS_IS_ABSTRACT (1UL << 20) |
|
|
| |
| |
| |
| #define _Py_TPFLAGS_MATCH_SELF (1UL << 22) |
|
|
| |
| #define Py_TPFLAGS_ITEMS_AT_END (1UL << 23) |
|
|
| |
| #define Py_TPFLAGS_LONG_SUBCLASS (1UL << 24) |
| #define Py_TPFLAGS_LIST_SUBCLASS (1UL << 25) |
| #define Py_TPFLAGS_TUPLE_SUBCLASS (1UL << 26) |
| #define Py_TPFLAGS_BYTES_SUBCLASS (1UL << 27) |
| #define Py_TPFLAGS_UNICODE_SUBCLASS (1UL << 28) |
| #define Py_TPFLAGS_DICT_SUBCLASS (1UL << 29) |
| #define Py_TPFLAGS_BASE_EXC_SUBCLASS (1UL << 30) |
| #define Py_TPFLAGS_TYPE_SUBCLASS (1UL << 31) |
|
|
| #define Py_TPFLAGS_DEFAULT ( \ |
| Py_TPFLAGS_HAVE_STACKLESS_EXTENSION | \ |
| 0) |
|
|
| |
| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| #define Py_TPFLAGS_HAVE_FINALIZE (1UL << 0) |
| #define Py_TPFLAGS_HAVE_VERSION_TAG (1UL << 18) |
|
|
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #if defined(Py_REF_DEBUG) && !defined(Py_LIMITED_API) |
| PyAPI_FUNC(void) _Py_NegativeRefcount(const char *filename, int lineno, |
| PyObject *op); |
| PyAPI_FUNC(void) _Py_INCREF_IncRefTotal(void); |
| PyAPI_FUNC(void) _Py_DECREF_DecRefTotal(void); |
| #endif |
|
|
| PyAPI_FUNC(void) _Py_Dealloc(PyObject *); |
|
|
| |
| |
| |
| |
| PyAPI_FUNC(void) Py_IncRef(PyObject *); |
| PyAPI_FUNC(void) Py_DecRef(PyObject *); |
|
|
| |
| |
| PyAPI_FUNC(void) _Py_IncRef(PyObject *); |
| PyAPI_FUNC(void) _Py_DecRef(PyObject *); |
|
|
| static inline Py_ALWAYS_INLINE void Py_INCREF(PyObject *op) |
| { |
| #if defined(Py_LIMITED_API) && (Py_LIMITED_API+0 >= 0x030c0000 || defined(Py_REF_DEBUG)) |
| |
| |
| |
| |
| # if Py_LIMITED_API+0 >= 0x030a00A7 |
| _Py_IncRef(op); |
| # else |
| Py_IncRef(op); |
| # endif |
| #else |
| |
| |
| #if defined(Py_GIL_DISABLED) |
| uint32_t local = _Py_atomic_load_uint32_relaxed(&op->ob_ref_local); |
| uint32_t new_local = local + 1; |
| if (new_local == 0) { |
| |
| return; |
| } |
| if (_Py_IsOwnedByCurrentThread(op)) { |
| _Py_atomic_store_uint32_relaxed(&op->ob_ref_local, new_local); |
| } |
| else { |
| _Py_atomic_add_ssize(&op->ob_ref_shared, (1 << _Py_REF_SHARED_SHIFT)); |
| } |
| #elif SIZEOF_VOID_P > 4 |
| |
| PY_UINT32_T cur_refcnt = op->ob_refcnt_split[PY_BIG_ENDIAN]; |
| PY_UINT32_T new_refcnt = cur_refcnt + 1; |
| if (new_refcnt == 0) { |
| |
| |
| return; |
| } |
| op->ob_refcnt_split[PY_BIG_ENDIAN] = new_refcnt; |
| #else |
| |
| if (_Py_IsImmortal(op)) { |
| return; |
| } |
| op->ob_refcnt++; |
| #endif |
| _Py_INCREF_STAT_INC(); |
| #ifdef Py_REF_DEBUG |
| _Py_INCREF_IncRefTotal(); |
| #endif |
| #endif |
| } |
| #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 |
| # define Py_INCREF(op) Py_INCREF(_PyObject_CAST(op)) |
| #endif |
|
|
|
|
| #if !defined(Py_LIMITED_API) && defined(Py_GIL_DISABLED) |
| |
| PyAPI_FUNC(void) _Py_DecRefShared(PyObject *); |
| PyAPI_FUNC(void) _Py_DecRefSharedDebug(PyObject *, const char *, int); |
|
|
| |
| |
| |
| |
| PyAPI_FUNC(void) _Py_MergeZeroLocalRefcount(PyObject *); |
| #endif |
|
|
| #if defined(Py_LIMITED_API) && (Py_LIMITED_API+0 >= 0x030c0000 || defined(Py_REF_DEBUG)) |
| |
| |
| |
| |
| static inline void Py_DECREF(PyObject *op) { |
| # if Py_LIMITED_API+0 >= 0x030a00A7 |
| _Py_DecRef(op); |
| # else |
| Py_DecRef(op); |
| # endif |
| } |
| #define Py_DECREF(op) Py_DECREF(_PyObject_CAST(op)) |
|
|
| #elif defined(Py_GIL_DISABLED) && defined(Py_REF_DEBUG) |
| static inline void Py_DECREF(const char *filename, int lineno, PyObject *op) |
| { |
| uint32_t local = _Py_atomic_load_uint32_relaxed(&op->ob_ref_local); |
| if (local == _Py_IMMORTAL_REFCNT_LOCAL) { |
| return; |
| } |
| _Py_DECREF_STAT_INC(); |
| _Py_DECREF_DecRefTotal(); |
| if (_Py_IsOwnedByCurrentThread(op)) { |
| if (local == 0) { |
| _Py_NegativeRefcount(filename, lineno, op); |
| } |
| local--; |
| _Py_atomic_store_uint32_relaxed(&op->ob_ref_local, local); |
| if (local == 0) { |
| _Py_MergeZeroLocalRefcount(op); |
| } |
| } |
| else { |
| _Py_DecRefSharedDebug(op, filename, lineno); |
| } |
| } |
| #define Py_DECREF(op) Py_DECREF(__FILE__, __LINE__, _PyObject_CAST(op)) |
|
|
| #elif defined(Py_GIL_DISABLED) |
| static inline void Py_DECREF(PyObject *op) |
| { |
| uint32_t local = _Py_atomic_load_uint32_relaxed(&op->ob_ref_local); |
| if (local == _Py_IMMORTAL_REFCNT_LOCAL) { |
| return; |
| } |
| _Py_DECREF_STAT_INC(); |
| if (_Py_IsOwnedByCurrentThread(op)) { |
| local--; |
| _Py_atomic_store_uint32_relaxed(&op->ob_ref_local, local); |
| if (local == 0) { |
| _Py_MergeZeroLocalRefcount(op); |
| } |
| } |
| else { |
| _Py_DecRefShared(op); |
| } |
| } |
| #define Py_DECREF(op) Py_DECREF(_PyObject_CAST(op)) |
|
|
| #elif defined(Py_REF_DEBUG) |
| static inline void Py_DECREF(const char *filename, int lineno, PyObject *op) |
| { |
| if (op->ob_refcnt <= 0) { |
| _Py_NegativeRefcount(filename, lineno, op); |
| } |
| if (_Py_IsImmortal(op)) { |
| return; |
| } |
| _Py_DECREF_STAT_INC(); |
| _Py_DECREF_DecRefTotal(); |
| if (--op->ob_refcnt == 0) { |
| _Py_Dealloc(op); |
| } |
| } |
| #define Py_DECREF(op) Py_DECREF(__FILE__, __LINE__, _PyObject_CAST(op)) |
|
|
| #else |
| static inline Py_ALWAYS_INLINE void Py_DECREF(PyObject *op) |
| { |
| |
| |
| if (_Py_IsImmortal(op)) { |
| return; |
| } |
| _Py_DECREF_STAT_INC(); |
| if (--op->ob_refcnt == 0) { |
| _Py_Dealloc(op); |
| } |
| } |
| #define Py_DECREF(op) Py_DECREF(_PyObject_CAST(op)) |
| #endif |
|
|
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| #ifdef _Py_TYPEOF |
| #define Py_CLEAR(op) \ |
| do { \ |
| _Py_TYPEOF(op)* _tmp_op_ptr = &(op); \ |
| _Py_TYPEOF(op) _tmp_old_op = (*_tmp_op_ptr); \ |
| if (_tmp_old_op != NULL) { \ |
| *_tmp_op_ptr = _Py_NULL; \ |
| Py_DECREF(_tmp_old_op); \ |
| } \ |
| } while (0) |
| #else |
| #define Py_CLEAR(op) \ |
| do { \ |
| PyObject **_tmp_op_ptr = _Py_CAST(PyObject**, &(op)); \ |
| PyObject *_tmp_old_op = (*_tmp_op_ptr); \ |
| if (_tmp_old_op != NULL) { \ |
| PyObject *_null_ptr = _Py_NULL; \ |
| memcpy(_tmp_op_ptr, &_null_ptr, sizeof(PyObject*)); \ |
| Py_DECREF(_tmp_old_op); \ |
| } \ |
| } while (0) |
| #endif |
|
|
|
|
| |
| static inline void Py_XINCREF(PyObject *op) |
| { |
| if (op != _Py_NULL) { |
| Py_INCREF(op); |
| } |
| } |
| #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 |
| # define Py_XINCREF(op) Py_XINCREF(_PyObject_CAST(op)) |
| #endif |
|
|
| static inline void Py_XDECREF(PyObject *op) |
| { |
| if (op != _Py_NULL) { |
| Py_DECREF(op); |
| } |
| } |
| #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 |
| # define Py_XDECREF(op) Py_XDECREF(_PyObject_CAST(op)) |
| #endif |
|
|
| |
| |
| PyAPI_FUNC(PyObject*) Py_NewRef(PyObject *obj); |
|
|
| |
| PyAPI_FUNC(PyObject*) Py_XNewRef(PyObject *obj); |
|
|
| static inline PyObject* _Py_NewRef(PyObject *obj) |
| { |
| Py_INCREF(obj); |
| return obj; |
| } |
|
|
| static inline PyObject* _Py_XNewRef(PyObject *obj) |
| { |
| Py_XINCREF(obj); |
| return obj; |
| } |
|
|
| |
| |
| |
| #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 |
| # define Py_NewRef(obj) _Py_NewRef(_PyObject_CAST(obj)) |
| # define Py_XNewRef(obj) _Py_XNewRef(_PyObject_CAST(obj)) |
| #else |
| # define Py_NewRef(obj) _Py_NewRef(obj) |
| # define Py_XNewRef(obj) _Py_XNewRef(obj) |
| #endif |
|
|
|
|
| #define Py_CONSTANT_NONE 0 |
| #define Py_CONSTANT_FALSE 1 |
| #define Py_CONSTANT_TRUE 2 |
| #define Py_CONSTANT_ELLIPSIS 3 |
| #define Py_CONSTANT_NOT_IMPLEMENTED 4 |
| #define Py_CONSTANT_ZERO 5 |
| #define Py_CONSTANT_ONE 6 |
| #define Py_CONSTANT_EMPTY_STR 7 |
| #define Py_CONSTANT_EMPTY_BYTES 8 |
| #define Py_CONSTANT_EMPTY_TUPLE 9 |
|
|
| #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030d0000 |
| PyAPI_FUNC(PyObject*) Py_GetConstant(unsigned int constant_id); |
| PyAPI_FUNC(PyObject*) Py_GetConstantBorrowed(unsigned int constant_id); |
| #endif |
|
|
|
|
| |
| |
| |
| |
| PyAPI_DATA(PyObject) _Py_NoneStruct; |
|
|
| #if defined(Py_LIMITED_API) && Py_LIMITED_API+0 >= 0x030D0000 |
| # define Py_None Py_GetConstantBorrowed(Py_CONSTANT_NONE) |
| #else |
| # define Py_None (&_Py_NoneStruct) |
| #endif |
|
|
| |
| PyAPI_FUNC(int) Py_IsNone(PyObject *x); |
| #define Py_IsNone(x) Py_Is((x), Py_None) |
|
|
| |
| |
| #if defined(Py_LIMITED_API) && Py_LIMITED_API+0 < 0x030c0000 |
| # define Py_RETURN_NONE return Py_NewRef(Py_None) |
| #else |
| # define Py_RETURN_NONE return Py_None |
| #endif |
|
|
| |
| |
| |
| |
| PyAPI_DATA(PyObject) _Py_NotImplementedStruct; |
|
|
| #if defined(Py_LIMITED_API) && Py_LIMITED_API+0 >= 0x030D0000 |
| # define Py_NotImplemented Py_GetConstantBorrowed(Py_CONSTANT_NOT_IMPLEMENTED) |
| #else |
| # define Py_NotImplemented (&_Py_NotImplementedStruct) |
| #endif |
|
|
| |
| #define Py_RETURN_NOTIMPLEMENTED return Py_NotImplemented |
|
|
| |
| #define Py_LT 0 |
| #define Py_LE 1 |
| #define Py_EQ 2 |
| #define Py_NE 3 |
| #define Py_GT 4 |
| #define Py_GE 5 |
|
|
| #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030A0000 |
| |
| typedef enum { |
| PYGEN_RETURN = 0, |
| PYGEN_ERROR = -1, |
| PYGEN_NEXT = 1, |
| } PySendResult; |
| #endif |
|
|
| |
| |
| |
| |
| |
| #define Py_RETURN_RICHCOMPARE(val1, val2, op) \ |
| do { \ |
| switch (op) { \ |
| case Py_EQ: if ((val1) == (val2)) Py_RETURN_TRUE; Py_RETURN_FALSE; \ |
| case Py_NE: if ((val1) != (val2)) Py_RETURN_TRUE; Py_RETURN_FALSE; \ |
| case Py_LT: if ((val1) < (val2)) Py_RETURN_TRUE; Py_RETURN_FALSE; \ |
| case Py_GT: if ((val1) > (val2)) Py_RETURN_TRUE; Py_RETURN_FALSE; \ |
| case Py_LE: if ((val1) <= (val2)) Py_RETURN_TRUE; Py_RETURN_FALSE; \ |
| case Py_GE: if ((val1) >= (val2)) Py_RETURN_TRUE; Py_RETURN_FALSE; \ |
| default: \ |
| Py_UNREACHABLE(); \ |
| } \ |
| } while (0) |
|
|
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #ifndef Py_LIMITED_API |
| # define Py_CPYTHON_OBJECT_H |
| # include "cpython/object.h" |
| # undef Py_CPYTHON_OBJECT_H |
| #endif |
|
|
|
|
| static inline int |
| PyType_HasFeature(PyTypeObject *type, unsigned long feature) |
| { |
| unsigned long flags; |
| #ifdef Py_LIMITED_API |
| |
| flags = PyType_GetFlags(type); |
| #else |
| # ifdef Py_GIL_DISABLED |
| flags = _Py_atomic_load_ulong_relaxed(&type->tp_flags); |
| # else |
| flags = type->tp_flags; |
| # endif |
| #endif |
| return ((flags & feature) != 0); |
| } |
|
|
| #define PyType_FastSubclass(type, flag) PyType_HasFeature((type), (flag)) |
|
|
| static inline int PyType_Check(PyObject *op) { |
| return PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_TYPE_SUBCLASS); |
| } |
| #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 |
| # define PyType_Check(op) PyType_Check(_PyObject_CAST(op)) |
| #endif |
|
|
| #define _PyType_CAST(op) \ |
| (assert(PyType_Check(op)), _Py_CAST(PyTypeObject*, (op))) |
|
|
| static inline int PyType_CheckExact(PyObject *op) { |
| return Py_IS_TYPE(op, &PyType_Type); |
| } |
| #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 |
| # define PyType_CheckExact(op) PyType_CheckExact(_PyObject_CAST(op)) |
| #endif |
|
|
| #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030d0000 |
| PyAPI_FUNC(PyObject *) PyType_GetModuleByDef(PyTypeObject *, PyModuleDef *); |
| #endif |
|
|
| #ifdef __cplusplus |
| } |
| #endif |
| #endif |
|
|