diff options
-rw-r--r-- | Include/cpython/cellobject.h | 19 | ||||
-rw-r--r-- | Objects/cellobject.c | 15 | ||||
-rw-r--r-- | Objects/frameobject.c | 2 |
3 files changed, 25 insertions, 11 deletions
diff --git a/Include/cpython/cellobject.h b/Include/cpython/cellobject.h index e07f9d1..f778f86 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 86a89f02e6..1ddf4c5 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 56c4fce..60f0f2f 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) { |