bpo-35059: Add _PyObject_CAST() macro by vstinner · Pull Request #10645 · python/cpython
/* Cast argument to PyObject* type. */ #define _PyObject_CAST(op) ((PyObject*)(op))
typedef struct { PyObject ob_base; Py_ssize_t ob_size; /* Number of items in variable part */ } PyVarObject;
#define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt) #define Py_TYPE(ob) (((PyObject*)(ob))->ob_type) #define Py_SIZE(ob) (((PyVarObject*)(ob))->ob_size) /* Cast argument to PyVarObject* type. */ #define _PyVarObject_CAST(op) ((PyVarObject*)(op))
#define Py_REFCNT(ob) (_PyObject_CAST(ob)->ob_refcnt) #define Py_TYPE(ob) (_PyObject_CAST(ob)->ob_type) #define Py_SIZE(ob) (_PyVarObject_CAST(ob)->ob_size)
#ifndef Py_LIMITED_API /********************* String Literals ****************************************/
#define Py_INCREF(op) _Py_INCREF((PyObject *)(op)) #define Py_INCREF(op) _Py_INCREF(_PyObject_CAST(op))
static inline void _Py_DECREF(const char *filename, int lineno, PyObject *op)
#define Py_DECREF(op) _Py_DECREF(__FILE__, __LINE__, (PyObject *)(op)) #define Py_DECREF(op) _Py_DECREF(__FILE__, __LINE__, _PyObject_CAST(op))
/* Safely decref `op` and set `op` to NULL, especially useful in tp_clear
#define Py_XINCREF(op) _Py_XINCREF((PyObject *)(op)) #define Py_XINCREF(op) _Py_XINCREF(_PyObject_CAST(op))
static inline void _Py_XDECREF(PyObject *op) {
#define Py_XDECREF(op) _Py_XDECREF((PyObject *)(op)) #define Py_XDECREF(op) _Py_XDECREF(_PyObject_CAST(op))
#ifndef Py_LIMITED_API /* Safely decref `op` and set `op` to `op2`.
#define Py_SETREF(op, op2) \ do { \ PyObject *_py_tmp = (PyObject *)(op); \ PyObject *_py_tmp = _PyObject_CAST(op); \ (op) = (op2); \ Py_DECREF(_py_tmp); \ } while (0)
#define Py_XSETREF(op, op2) \ do { \ PyObject *_py_tmp = (PyObject *)(op); \ PyObject *_py_tmp = _PyObject_CAST(op); \ (op) = (op2); \ Py_XDECREF(_py_tmp); \ } while (0)
#ifndef Py_LIMITED_API