diff --git a/Include/cpython/cellobject.h b/Include/cpython/cellobject.h index e07f9d1de79423..f778f86de74695 100644 --- a/Include/cpython/cellobject.h +++ b/Include/cpython/cellobject.h @@ -21,8 +21,23 @@ PyAPI_FUNC(PyObject *) PyCell_New(PyObject *); PyAPI_FUNC(PyObject *) PyCell_Get(PyObject *); PyAPI_FUNC(int) PyCell_Set(PyObject *, PyObject *); -#define PyCell_GET(op) (((PyCellObject *)(op))->ob_ref) -#define PyCell_SET(op, v) _Py_RVALUE(((PyCellObject *)(op))->ob_ref = (v)) +static inline PyObject* PyCell_GET(PyObject *op) { + assert(PyCell_Check(op)); + PyCellObject *cell = _Py_CAST(PyCellObject*, op); + return cell->ob_ref; +} +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030c0000 +# define PyCell_GET(op) PyCell_GET(_PyObject_CAST(op)) +#endif + +static inline void PyCell_SET(PyObject *op, PyObject *value) { + assert(PyCell_Check(op)); + PyCellObject *cell = _Py_CAST(PyCellObject*, op); + cell->ob_ref = value; +} +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030c0000 +# define PyCell_SET(op, value) PyCell_SET(_PyObject_CAST(op), (value)) +#endif #ifdef __cplusplus } diff --git a/Objects/cellobject.c b/Objects/cellobject.c index 86a89f02e60d3c..1ddf4c5d8b8bdc 100644 --- a/Objects/cellobject.c +++ b/Objects/cellobject.c @@ -56,22 +56,21 @@ PyCell_Get(PyObject *op) PyErr_BadInternalCall(); return NULL; } - Py_XINCREF(((PyCellObject*)op)->ob_ref); - return PyCell_GET(op); + PyObject *value = PyCell_GET(op); + return Py_XNewRef(value); } int -PyCell_Set(PyObject *op, PyObject *obj) +PyCell_Set(PyObject *op, PyObject *value) { - PyObject* oldobj; if (!PyCell_Check(op)) { PyErr_BadInternalCall(); return -1; } - oldobj = PyCell_GET(op); - Py_XINCREF(obj); - PyCell_SET(op, obj); - Py_XDECREF(oldobj); + PyObject *old_value = PyCell_GET(op); + Py_XINCREF(value); + PyCell_SET(op, value); + Py_XDECREF(old_value); return 0; } diff --git a/Objects/frameobject.c b/Objects/frameobject.c index 56c4fceb6b893d..60f0f2f4edd388 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -1086,9 +1086,9 @@ _PyFrame_LocalsToFast(_PyInterpreterFrame *frame, int clear) if (cell != NULL) { oldvalue = PyCell_GET(cell); if (value != oldvalue) { - Py_XDECREF(oldvalue); Py_XINCREF(value); PyCell_SET(cell, value); + Py_XDECREF(oldvalue); } } else if (value != oldvalue) {