]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-89653: PEP 670: Convert PyCell macros to functions (#92653)
authorVictor Stinner <vstinner@python.org>
Wed, 11 May 2022 21:24:48 +0000 (23:24 +0200)
committerGitHub <noreply@github.com>
Wed, 11 May 2022 21:24:48 +0000 (23:24 +0200)
Convert the following macros to static inline functions:

* PyCell_GET()
* PyCell_SET()

Limited C API version 3.12 no longer casts arguments.

Fix also usage of PyCell_SET(): only delete the old value after
setting the new value.

Include/cpython/cellobject.h
Objects/cellobject.c
Objects/frameobject.c

index e07f9d1de79423cf8f9a67580d434a486a8b7f96..f778f86de746956f4bd7f323d42f519379f8f2ba 100644 (file)
@@ -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
 }
index 86a89f02e60d3c55e8ac784e918bf541f5b6fe6a..1ddf4c5d8b8bdcf80bc38cc4031d7936d4e16654 100644 (file)
@@ -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;
 }
 
index 56c4fceb6b893d570f6cad6ad7e0c532e0f82007..60f0f2f4edd388f2bbb4aa42275fbb2996f80522 100644 (file)
@@ -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) {