bpo-35059: Add _PyObject_CAST() macro by vstinner · Pull Request #10645 · python/cpython

Expand Up @@ -112,14 +112,20 @@ typedef struct _object { struct _typeobject *ob_type; } PyObject;
/* 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 ****************************************/ Expand Down Expand Up @@ -814,7 +820,7 @@ static inline void _Py_INCREF(PyObject *op) op->ob_refcnt++; }
#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) Expand All @@ -832,7 +838,7 @@ static inline void _Py_DECREF(const char *filename, int lineno, } }
#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 Expand Down Expand Up @@ -871,7 +877,7 @@ static inline void _Py_DECREF(const char *filename, int lineno, */ #define Py_CLEAR(op) \ do { \ PyObject *_py_tmp = (PyObject *)(op); \ PyObject *_py_tmp = _PyObject_CAST(op); \ if (_py_tmp != NULL) { \ (op) = NULL; \ Py_DECREF(_py_tmp); \ Expand All @@ -886,7 +892,7 @@ static inline void _Py_XINCREF(PyObject *op) } }
#define Py_XINCREF(op) _Py_XINCREF((PyObject *)(op)) #define Py_XINCREF(op) _Py_XINCREF(_PyObject_CAST(op))
static inline void _Py_XDECREF(PyObject *op) { Expand All @@ -895,7 +901,7 @@ 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`. Expand All @@ -919,14 +925,14 @@ static inline void _Py_XDECREF(PyObject *op)
#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) Expand Down Expand Up @@ -1122,7 +1128,7 @@ PyAPI_FUNC(void) _PyTrash_thread_destroy_chain(void); _PyTrash_thread_destroy_chain(); \ } \ else \ _PyTrash_thread_deposit_object((PyObject*)op); \ _PyTrash_thread_deposit_object(_PyObject_CAST(op)); \ } while (0);
#ifndef Py_LIMITED_API Expand Down