|
#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 |
|
|
|
#if defined(Py_LIMITED_API) && defined(Py_TRACE_REFS) |
|
# error Py_LIMITED_API is incompatible with Py_TRACE_REFS |
|
#endif |
|
|
|
|
|
|
|
typedef struct _typeobject PyTypeObject; |
|
|
|
#ifdef Py_TRACE_REFS |
|
|
|
#define _PyObject_HEAD_EXTRA \ |
|
struct _object *_ob_next; \ |
|
struct _object *_ob_prev; |
|
|
|
#define _PyObject_EXTRA_INIT 0, 0, |
|
|
|
#else |
|
# define _PyObject_HEAD_EXTRA |
|
# define _PyObject_EXTRA_INIT |
|
#endif |
|
|
|
|
|
#define PyObject_HEAD PyObject ob_base; |
|
|
|
#define PyObject_HEAD_INIT(type) \ |
|
{ _PyObject_EXTRA_INIT \ |
|
1, type }, |
|
|
|
#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 |
|
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct _object { |
|
_PyObject_HEAD_EXTRA |
|
Py_ssize_t ob_refcnt; |
|
PyTypeObject *ob_type; |
|
} PyObject; |
|
|
|
|
|
#define _PyObject_CAST(op) ((PyObject*)(op)) |
|
#define _PyObject_CAST_CONST(op) ((const PyObject*)(op)) |
|
|
|
typedef struct { |
|
PyObject ob_base; |
|
Py_ssize_t ob_size; |
|
} PyVarObject; |
|
|
|
|
|
#define _PyVarObject_CAST(op) ((PyVarObject*)(op)) |
|
#define _PyVarObject_CAST_CONST(op) ((const PyVarObject*)(op)) |
|
|
|
|
|
|
|
PyAPI_FUNC(int) Py_Is(PyObject *x, PyObject *y); |
|
#define Py_Is(x, y) ((x) == (y)) |
|
|
|
|
|
static inline Py_ssize_t _Py_REFCNT(const PyObject *ob) { |
|
return ob->ob_refcnt; |
|
} |
|
#define Py_REFCNT(ob) _Py_REFCNT(_PyObject_CAST_CONST(ob)) |
|
|
|
|
|
|
|
#define Py_TYPE(ob) (_PyObject_CAST(ob)->ob_type) |
|
|
|
|
|
#define Py_SIZE(ob) (_PyVarObject_CAST(ob)->ob_size) |
|
|
|
|
|
static inline int _Py_IS_TYPE(const PyObject *ob, const PyTypeObject *type) { |
|
|
|
|
|
return ob->ob_type == type; |
|
} |
|
#define Py_IS_TYPE(ob, type) _Py_IS_TYPE(_PyObject_CAST_CONST(ob), type) |
|
|
|
|
|
static inline void _Py_SET_REFCNT(PyObject *ob, Py_ssize_t refcnt) { |
|
ob->ob_refcnt = refcnt; |
|
} |
|
#define Py_SET_REFCNT(ob, refcnt) _Py_SET_REFCNT(_PyObject_CAST(ob), refcnt) |
|
|
|
|
|
static inline void _Py_SET_TYPE(PyObject *ob, PyTypeObject *type) { |
|
ob->ob_type = type; |
|
} |
|
#define Py_SET_TYPE(ob, type) _Py_SET_TYPE(_PyObject_CAST(ob), type) |
|
|
|
|
|
static inline void _Py_SET_SIZE(PyVarObject *ob, Py_ssize_t size) { |
|
ob->ob_size = size; |
|
} |
|
#define Py_SET_SIZE(ob, size) _Py_SET_SIZE(_PyVarObject_CAST(ob), size) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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); |
|
|
|
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(struct _typeobject *); |
|
PyAPI_FUNC(void *) PyType_GetModuleState(struct _typeobject *); |
|
#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); |
|
} |
|
#define PyObject_TypeCheck(ob, type) _PyObject_TypeCheck(_PyObject_CAST(ob), type) |
|
|
|
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_HasAttrString(PyObject *, const char *); |
|
PyAPI_FUNC(PyObject *) PyObject_GetAttr(PyObject *, PyObject *); |
|
PyAPI_FUNC(int) PyObject_SetAttr(PyObject *, PyObject *, PyObject *); |
|
PyAPI_FUNC(int) PyObject_HasAttr(PyObject *, PyObject *); |
|
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_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) |
|
|
|
|
|
#ifndef Py_LIMITED_API |
|
#define Py_TPFLAGS_HAVE_VECTORCALL (1UL << 11) |
|
|
|
#define _Py_TPFLAGS_HAVE_VECTORCALL Py_TPFLAGS_HAVE_VECTORCALL |
|
#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_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) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef Py_REF_DEBUG |
|
PyAPI_DATA(Py_ssize_t) _Py_RefTotal; |
|
PyAPI_FUNC(void) _Py_NegativeRefcount(const char *filename, int lineno, |
|
PyObject *op); |
|
#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 void _Py_INCREF(PyObject *op) |
|
{ |
|
#if defined(Py_REF_DEBUG) && defined(Py_LIMITED_API) && Py_LIMITED_API+0 >= 0x030A0000 |
|
|
|
_Py_IncRef(op); |
|
#else |
|
|
|
|
|
#ifdef Py_REF_DEBUG |
|
_Py_RefTotal++; |
|
#endif |
|
op->ob_refcnt++; |
|
#endif |
|
} |
|
#define Py_INCREF(op) _Py_INCREF(_PyObject_CAST(op)) |
|
|
|
static inline void _Py_DECREF( |
|
#if defined(Py_REF_DEBUG) && !(defined(Py_LIMITED_API) && Py_LIMITED_API+0 >= 0x030A0000) |
|
const char *filename, int lineno, |
|
#endif |
|
PyObject *op) |
|
{ |
|
#if defined(Py_REF_DEBUG) && defined(Py_LIMITED_API) && Py_LIMITED_API+0 >= 0x030A0000 |
|
|
|
_Py_DecRef(op); |
|
#else |
|
|
|
|
|
#ifdef Py_REF_DEBUG |
|
_Py_RefTotal--; |
|
#endif |
|
if (--op->ob_refcnt != 0) { |
|
#ifdef Py_REF_DEBUG |
|
if (op->ob_refcnt < 0) { |
|
_Py_NegativeRefcount(filename, lineno, op); |
|
} |
|
#endif |
|
} |
|
else { |
|
_Py_Dealloc(op); |
|
} |
|
#endif |
|
} |
|
#if defined(Py_REF_DEBUG) && !(defined(Py_LIMITED_API) && Py_LIMITED_API+0 >= 0x030A0000) |
|
# define Py_DECREF(op) _Py_DECREF(__FILE__, __LINE__, _PyObject_CAST(op)) |
|
#else |
|
# define Py_DECREF(op) _Py_DECREF(_PyObject_CAST(op)) |
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define Py_CLEAR(op) \ |
|
do { \ |
|
PyObject *_py_tmp = _PyObject_CAST(op); \ |
|
if (_py_tmp != NULL) { \ |
|
(op) = NULL; \ |
|
Py_DECREF(_py_tmp); \ |
|
} \ |
|
} while (0) |
|
|
|
|
|
static inline void _Py_XINCREF(PyObject *op) |
|
{ |
|
if (op != NULL) { |
|
Py_INCREF(op); |
|
} |
|
} |
|
|
|
#define Py_XINCREF(op) _Py_XINCREF(_PyObject_CAST(op)) |
|
|
|
static inline void _Py_XDECREF(PyObject *op) |
|
{ |
|
if (op != NULL) { |
|
Py_DECREF(op); |
|
} |
|
} |
|
|
|
#define Py_XDECREF(op) _Py_XDECREF(_PyObject_CAST(op)) |
|
|
|
|
|
|
|
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; |
|
} |
|
|
|
|
|
|
|
|
|
#define Py_NewRef(obj) _Py_NewRef(_PyObject_CAST(obj)) |
|
#define Py_XNewRef(obj) _Py_XNewRef(_PyObject_CAST(obj)) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PyAPI_DATA(PyObject) _Py_NoneStruct; |
|
#define Py_None (&_Py_NoneStruct) |
|
|
|
|
|
PyAPI_FUNC(int) Py_IsNone(PyObject *x); |
|
#define Py_IsNone(x) Py_Is((x), Py_None) |
|
|
|
|
|
#define Py_RETURN_NONE return Py_NewRef(Py_None) |
|
|
|
|
|
|
|
|
|
|
|
PyAPI_DATA(PyObject) _Py_NotImplementedStruct; |
|
#define Py_NotImplemented (&_Py_NotImplementedStruct) |
|
|
|
|
|
#define Py_RETURN_NOTIMPLEMENTED return Py_NewRef(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 |
|
flags = type->tp_flags; |
|
#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); |
|
} |
|
#define PyType_Check(op) _PyType_Check(_PyObject_CAST(op)) |
|
|
|
static inline int _PyType_CheckExact(PyObject *op) { |
|
return Py_IS_TYPE(op, &PyType_Type); |
|
} |
|
#define PyType_CheckExact(op) _PyType_CheckExact(_PyObject_CAST(op)) |
|
|
|
#ifdef __cplusplus |
|
} |
|
#endif |
|
#endif |
|
|