Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bpo-35059: Add _PyObject_CAST() macro #10645

Merged
merged 1 commit into from
Nov 22, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Include/internal/pycore_object.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ static inline void _PyObject_GC_TRACK_impl(const char *filename, int lineno,
}

#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.
*
Expand Down Expand Up @@ -70,7 +70,7 @@ static inline void _PyObject_GC_UNTRACK_impl(const char *filename, int lineno,
}

#define _PyObject_GC_UNTRACK(op) \
_PyObject_GC_UNTRACK_impl(__FILE__, __LINE__, (PyObject *)(op))
_PyObject_GC_UNTRACK_impl(__FILE__, __LINE__, _PyObject_CAST(op))

#ifdef __cplusplus
}
Expand Down
28 changes: 17 additions & 11 deletions Include/object.h
Original file line number Diff line number Diff line change
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
4 changes: 2 additions & 2 deletions Include/objimpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ PyAPI_FUNC(Py_ssize_t) _PyGC_CollectIfEnabled(void);

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
Expand Down Expand Up @@ -356,7 +356,7 @@ PyAPI_FUNC(void) PyObject_GC_Del(void *);
#define Py_VISIT(op) \
do { \
if (op) { \
int vret = visit((PyObject *)(op), arg); \
int vret = visit(_PyObject_CAST(op), arg); \
if (vret) \
return vret; \
} \
Expand Down
10 changes: 5 additions & 5 deletions Include/odictobject.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,13 @@ PyAPI_FUNC(int) PyODict_SetItem(PyObject *od, PyObject *key, PyObject *item);
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

Expand Down
6 changes: 3 additions & 3 deletions Include/unicodeobject.h
Original file line number Diff line number Diff line change
Expand Up @@ -380,7 +380,7 @@ PyAPI_DATA(PyTypeObject) PyUnicodeIter_Type;
(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) */
Expand All @@ -397,7 +397,7 @@ PyAPI_DATA(PyTypeObject) PyUnicodeIter_Type;
#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) \
Expand Down Expand Up @@ -549,7 +549,7 @@ enum PyUnicode_Kind {
#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
Expand Down