}
#define _PyObject_GC_TRACK(op) \
- _PyObject_GC_TRACK_impl(__FILE__, __LINE__, (PyObject *)(op))
+ _PyObject_GC_TRACK_impl(__FILE__, __LINE__, _PyObject_CAST(op))
/* Tell the GC to stop tracking this object.
*
}
#define _PyObject_GC_UNTRACK(op) \
- _PyObject_GC_UNTRACK_impl(__FILE__, __LINE__, (PyObject *)(op))
+ _PyObject_GC_UNTRACK_impl(__FILE__, __LINE__, _PyObject_CAST(op))
#ifdef __cplusplus
}
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 ****************************************/
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)
}
}
-#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_CLEAR(op) \
do { \
- PyObject *_py_tmp = (PyObject *)(op); \
+ PyObject *_py_tmp = _PyObject_CAST(op); \
if (_py_tmp != NULL) { \
(op) = NULL; \
Py_DECREF(_py_tmp); \
}
}
-#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)
_PyTrash_thread_destroy_chain(); \
} \
else \
- _PyTrash_thread_deposit_object((PyObject*)op); \
+ _PyTrash_thread_deposit_object(_PyObject_CAST(op)); \
} while (0);
#ifndef Py_LIMITED_API
PyAPI_FUNC(PyVarObject *) _PyObject_GC_Resize(PyVarObject *, Py_ssize_t);
#define PyObject_GC_Resize(type, op, n) \
- ( (type *) _PyObject_GC_Resize((PyVarObject *)(op), (n)) )
+ ( (type *) _PyObject_GC_Resize(_PyVarObject_CAST(op), (n)) )
#ifndef Py_LIMITED_API
#define Py_VISIT(op) \
do { \
if (op) { \
- int vret = visit((PyObject *)(op), arg); \
+ int vret = visit(_PyObject_CAST(op), arg); \
if (vret) \
return vret; \
} \
PyAPI_FUNC(int) PyODict_DelItem(PyObject *od, PyObject *key);
/* wrappers around PyDict* functions */
-#define PyODict_GetItem(od, key) PyDict_GetItem((PyObject *)od, key)
+#define PyODict_GetItem(od, key) PyDict_GetItem(_PyObject_CAST(od), key)
#define PyODict_GetItemWithError(od, key) \
- PyDict_GetItemWithError((PyObject *)od, key)
-#define PyODict_Contains(od, key) PyDict_Contains((PyObject *)od, key)
-#define PyODict_Size(od) PyDict_Size((PyObject *)od)
+ PyDict_GetItemWithError(_PyObject_CAST(od), key)
+#define PyODict_Contains(od, key) PyDict_Contains(_PyObject_CAST(od), key)
+#define PyODict_Size(od) PyDict_Size(_PyObject_CAST(od))
#define PyODict_GetItemString(od, key) \
- PyDict_GetItemString((PyObject *)od, key)
+ PyDict_GetItemString(_PyObject_CAST(od), key)
#endif
(assert(PyUnicode_Check(op)), \
(((PyASCIIObject *)(op))->wstr) ? \
PyUnicode_WSTR_LENGTH(op) : \
- ((void)PyUnicode_AsUnicode((PyObject *)(op)), \
+ ((void)PyUnicode_AsUnicode(_PyObject_CAST(op)),\
assert(((PyASCIIObject *)(op))->wstr), \
PyUnicode_WSTR_LENGTH(op)))
/* Py_DEPRECATED(3.3) */
#define PyUnicode_AS_UNICODE(op) \
(assert(PyUnicode_Check(op)), \
(((PyASCIIObject *)(op))->wstr) ? (((PyASCIIObject *)(op))->wstr) : \
- PyUnicode_AsUnicode((PyObject *)(op)))
+ PyUnicode_AsUnicode(_PyObject_CAST(op)))
/* Py_DEPRECATED(3.3) */
#define PyUnicode_AS_DATA(op) \
#define PyUnicode_READY(op) \
(assert(PyUnicode_Check(op)), \
(PyUnicode_IS_READY(op) ? \
- 0 : _PyUnicode_Ready((PyObject *)(op))))
+ 0 : _PyUnicode_Ready(_PyObject_CAST(op))))
/* Return a maximum character value which is suitable for creating another
string based on op. This is always an approximation but more efficient