https://github.com/python/cpython/commit/d12d8c50cddeb79f8d6e3d26a33f8f6b14bb4071
commit: d12d8c50cddeb79f8d6e3d26a33f8f6b14bb4071
branch: main
author: Victor Stinner <vstin...@python.org>
committer: vstinner <vstin...@python.org>
date: 2025-03-13T10:14:59Z
summary:

gh-111178: Fix function signatures in odictobject.c (#131160)

Add _PyODictObject_CAST() macro.

files:
M Objects/odictobject.c

diff --git a/Objects/odictobject.c b/Objects/odictobject.c
index f2d8da0c567878..28ff40b4900fb3 100644
--- a/Objects/odictobject.c
+++ b/Objects/odictobject.c
@@ -500,6 +500,8 @@ struct _odictobject {
     PyObject *od_weakreflist;    /* holds weakrefs to the odict */
 };
 
+#define _PyODictObject_CAST(op) _Py_CAST(PyODictObject*, (op))
+
 
 /* ----------------------------------------------
  * odict keys (a simple doubly-linked list)
@@ -522,8 +524,8 @@ struct _odictnode {
 #define _odictnode_PREV(node) (node->prev)
 #define _odictnode_NEXT(node) (node->next)
 
-#define _odict_FIRST(od) (((PyODictObject *)od)->od_first)
-#define _odict_LAST(od) (((PyODictObject *)od)->od_last)
+#define _odict_FIRST(od) (_PyODictObject_CAST(od)->od_first)
+#define _odict_LAST(od) (_PyODictObject_CAST(od)->od_last)
 #define _odict_EMPTY(od) (_odict_FIRST(od) == NULL)
 #define _odict_FOREACH(od, node) \
     for (node = _odict_FIRST(od); node != NULL; node = _odictnode_NEXT(node))
@@ -857,12 +859,12 @@ _odict_keys_equal(PyODictObject *a, PyODictObject *b)
 /* mp_ass_subscript: __setitem__() and __delitem__() */
 
 static int
-odict_mp_ass_sub(PyODictObject *od, PyObject *v, PyObject *w)
+odict_mp_ass_sub(PyObject *od, PyObject *v, PyObject *w)
 {
     if (w == NULL)
-        return PyODict_DelItem((PyObject *)od, v);
+        return PyODict_DelItem(od, v);
     else
-        return PyODict_SetItem((PyObject *)od, v, w);
+        return PyODict_SetItem(od, v, w);
 }
 
 /* tp_as_mapping */
@@ -870,7 +872,7 @@ odict_mp_ass_sub(PyODictObject *od, PyObject *v, PyObject 
*w)
 static PyMappingMethods odict_as_mapping = {
     0,                                  /*mp_length*/
     0,                                  /*mp_subscript*/
-    (objobjargproc)odict_mp_ass_sub,    /*mp_ass_subscript*/
+    odict_mp_ass_sub,                   /*mp_ass_subscript*/
 };
 
 
@@ -953,8 +955,9 @@ OrderedDict_fromkeys_impl(PyTypeObject *type, PyObject 
*seq, PyObject *value)
 PyDoc_STRVAR(odict_sizeof__doc__, "");
 
 static PyObject *
-odict_sizeof(PyODictObject *od, PyObject *Py_UNUSED(ignored))
+odict_sizeof(PyObject *op, PyObject *Py_UNUSED(ignored))
 {
+    PyODictObject *od = _PyODictObject_CAST(op);
     Py_ssize_t res = _PyDict_SizeOf((PyDictObject *)od);
     res += sizeof(_ODictNode *) * od->od_fast_nodes_size;  /* od_fast_nodes */
     if (!_odict_EMPTY(od)) {
@@ -968,8 +971,9 @@ odict_sizeof(PyODictObject *od, PyObject 
*Py_UNUSED(ignored))
 PyDoc_STRVAR(odict_reduce__doc__, "Return state information for pickling");
 
 static PyObject *
-odict_reduce(register PyODictObject *od, PyObject *Py_UNUSED(ignored))
+odict_reduce(PyObject *op, PyObject *Py_UNUSED(ignored))
 {
+    register PyODictObject *od = _PyODictObject_CAST(op);
     PyObject *state, *result = NULL;
     PyObject *items_iter, *items, *args = NULL;
 
@@ -1063,12 +1067,12 @@ _odict_popkey_hash(PyObject *od, PyObject *key, 
PyObject *failobj,
 
     Py_BEGIN_CRITICAL_SECTION(od);
 
-    _ODictNode *node = _odict_find_node_hash((PyODictObject *)od, key, hash);
+    _ODictNode *node = _odict_find_node_hash(_PyODictObject_CAST(od), key, 
hash);
     if (node != NULL) {
         /* Pop the node first to avoid a possible dict resize (due to
            eval loop reentrancy) and complications due to hash collision
            resolution. */
-        int res = _odict_clear_node((PyODictObject *)od, node, key, hash);
+        int res = _odict_clear_node(_PyODictObject_CAST(od), node, key, hash);
         if (res < 0) {
             goto done;
         }
@@ -1192,9 +1196,10 @@ PyDoc_STRVAR(odict_clear__doc__,
              "od.clear() -> None.  Remove all items from od.");
 
 static PyObject *
-odict_clear(register PyODictObject *od, PyObject *Py_UNUSED(ignored))
+odict_clear(PyObject *op, PyObject *Py_UNUSED(ignored))
 {
-    PyDict_Clear((PyObject *)od);
+    register PyODictObject *od = _PyODictObject_CAST(op);
+    PyDict_Clear(op);
     _odict_clear_nodes(od);
     Py_RETURN_NONE;
 }
@@ -1208,8 +1213,9 @@ static int _PyODict_SetItem_KnownHash(PyObject *, 
PyObject *, PyObject *,
 PyDoc_STRVAR(odict_copy__doc__, "od.copy() -> a shallow copy of od");
 
 static PyObject *
-odict_copy(register PyODictObject *od, PyObject *Py_UNUSED(ignored))
+odict_copy(PyObject *op, PyObject *Py_UNUSED(ignored))
 {
+    register PyODictObject *od = _PyODictObject_CAST(op);
     _ODictNode *node;
     PyObject *od_copy;
 
@@ -1268,8 +1274,9 @@ PyDoc_STRVAR(odict_reversed__doc__, "od.__reversed__() 
<==> reversed(od)");
 static PyObject * odictiter_new(PyODictObject *, int);
 
 static PyObject *
-odict_reversed(PyODictObject *od, PyObject *Py_UNUSED(ignored))
+odict_reversed(PyObject *op, PyObject *Py_UNUSED(ignored))
 {
+    PyODictObject *od = _PyODictObject_CAST(op);
     return odictiter_new(od, _odict_ITER_KEYS|_odict_ITER_REVERSED);
 }
 
@@ -1330,9 +1337,9 @@ static PyMethodDef odict_methods[] = {
 
     /* overridden dict methods */
     ORDEREDDICT_FROMKEYS_METHODDEF
-    {"__sizeof__",      (PyCFunction)odict_sizeof,      METH_NOARGS,
+    {"__sizeof__",      odict_sizeof,      METH_NOARGS,
      odict_sizeof__doc__},
-    {"__reduce__",      (PyCFunction)odict_reduce,      METH_NOARGS,
+    {"__reduce__",      odict_reduce,      METH_NOARGS,
      odict_reduce__doc__},
     ORDEREDDICT_SETDEFAULT_METHODDEF
     ORDEREDDICT_POP_METHODDEF
@@ -1345,13 +1352,13 @@ static PyMethodDef odict_methods[] = {
      odict_items__doc__},
     {"update",          _PyCFunction_CAST(odict_update), METH_VARARGS | 
METH_KEYWORDS,
      odict_update__doc__},
-    {"clear",           (PyCFunction)odict_clear,       METH_NOARGS,
+    {"clear",           odict_clear,       METH_NOARGS,
      odict_clear__doc__},
-    {"copy",            (PyCFunction)odict_copy,        METH_NOARGS,
+    {"copy",            odict_copy,        METH_NOARGS,
      odict_copy__doc__},
 
     /* new methods */
-    {"__reversed__",    (PyCFunction)odict_reversed,    METH_NOARGS,
+    {"__reversed__",    odict_reversed,    METH_NOARGS,
      odict_reversed__doc__},
     ORDEREDDICT_MOVE_TO_END_METHODDEF
 
@@ -1377,8 +1384,9 @@ static PyGetSetDef odict_getset[] = {
 /* tp_dealloc */
 
 static void
-odict_dealloc(PyODictObject *self)
+odict_dealloc(PyObject *op)
 {
+    PyODictObject *self = _PyODictObject_CAST(op);
     PyObject_GC_UnTrack(self);
     Py_TRASHCAN_BEGIN(self, odict_dealloc)
 
@@ -1395,8 +1403,9 @@ odict_dealloc(PyODictObject *self)
 /* tp_repr */
 
 static PyObject *
-odict_repr(PyODictObject *self)
+odict_repr(PyObject *op)
 {
+    PyODictObject *self = _PyODictObject_CAST(op);
     int i;
     PyObject *result = NULL, *dcopy = NULL;
 
@@ -1431,8 +1440,9 @@ PyDoc_STRVAR(odict_doc,
 /* tp_traverse */
 
 static int
-odict_traverse(PyODictObject *od, visitproc visit, void *arg)
+odict_traverse(PyObject *op, visitproc visit, void *arg)
 {
+    PyODictObject *od = _PyODictObject_CAST(op);
     _ODictNode *node;
 
     Py_VISIT(od->od_inst_dict);
@@ -1445,8 +1455,9 @@ odict_traverse(PyODictObject *od, visitproc visit, void 
*arg)
 /* tp_clear */
 
 static int
-odict_tp_clear(PyODictObject *od)
+odict_tp_clear(PyObject *op)
 {
+    PyODictObject *od = _PyODictObject_CAST(op);
     Py_CLEAR(od->od_inst_dict);
     PyDict_Clear((PyObject *)od);
     _odict_clear_nodes(od);
@@ -1478,7 +1489,7 @@ odict_richcompare(PyObject *v, PyObject *w, int op)
         Py_DECREF(cmp);
 
         /* Try comparing odict keys. */
-        eq = _odict_keys_equal((PyODictObject *)v, (PyODictObject *)w);
+        eq = _odict_keys_equal(_PyODictObject_CAST(v), _PyODictObject_CAST(w));
         if (eq < 0)
             return NULL;
 
@@ -1492,9 +1503,9 @@ odict_richcompare(PyObject *v, PyObject *w, int op)
 /* tp_iter */
 
 static PyObject *
-odict_iter(PyODictObject *od)
+odict_iter(PyObject *op)
 {
-    return odictiter_new(od, _odict_ITER_KEYS);
+    return odictiter_new(_PyODictObject_CAST(op), _odict_ITER_KEYS);
 }
 
 /* tp_init */
@@ -1530,12 +1541,12 @@ PyTypeObject PyODict_Type = {
     "collections.OrderedDict",                  /* tp_name */
     sizeof(PyODictObject),                      /* tp_basicsize */
     0,                                          /* tp_itemsize */
-    (destructor)odict_dealloc,                  /* tp_dealloc */
+    odict_dealloc,                              /* tp_dealloc */
     0,                                          /* tp_vectorcall_offset */
     0,                                          /* tp_getattr */
     0,                                          /* tp_setattr */
     0,                                          /* tp_as_async */
-    (reprfunc)odict_repr,                       /* tp_repr */
+    odict_repr,                                 /* tp_repr */
     &odict_as_number,                           /* tp_as_number */
     0,                                          /* tp_as_sequence */
     &odict_as_mapping,                          /* tp_as_mapping */
@@ -1547,11 +1558,11 @@ PyTypeObject PyODict_Type = {
     0,                                          /* tp_as_buffer */
     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,/* tp_flags 
*/
     odict_doc,                                  /* tp_doc */
-    (traverseproc)odict_traverse,               /* tp_traverse */
-    (inquiry)odict_tp_clear,                    /* tp_clear */
-    (richcmpfunc)odict_richcompare,             /* tp_richcompare */
+    odict_traverse,                             /* tp_traverse */
+    odict_tp_clear,                             /* tp_clear */
+    odict_richcompare,                          /* tp_richcompare */
     offsetof(PyODictObject, od_weakreflist),    /* tp_weaklistoffset */
-    (getiterfunc)odict_iter,                    /* tp_iter */
+    odict_iter,                                 /* tp_iter */
     0,                                          /* tp_iternext */
     odict_methods,                              /* tp_methods */
     0,                                          /* tp_members */
@@ -1561,7 +1572,7 @@ PyTypeObject PyODict_Type = {
     0,                                          /* tp_descr_get */
     0,                                          /* tp_descr_set */
     offsetof(PyODictObject, od_inst_dict),      /* tp_dictoffset */
-    (initproc)odict_init,                       /* tp_init */
+    odict_init,                                 /* tp_init */
     PyType_GenericAlloc,                        /* tp_alloc */
     0,                                          /* tp_new */
     0,                                          /* tp_free */
@@ -1584,7 +1595,7 @@ _PyODict_SetItem_KnownHash(PyObject *od, PyObject *key, 
PyObject *value,
 {
     int res = _PyDict_SetItem_KnownHash(od, key, value, hash);
     if (res == 0) {
-        res = _odict_add_new_node((PyODictObject *)od, key, hash);
+        res = _odict_add_new_node(_PyODictObject_CAST(od), key, hash);
         if (res < 0) {
             /* Revert setting the value on the dict */
             PyObject *exc = PyErr_GetRaisedException();
@@ -1611,7 +1622,7 @@ PyODict_DelItem(PyObject *od, PyObject *key)
     Py_hash_t hash = PyObject_Hash(key);
     if (hash == -1)
         return -1;
-    res = _odict_clear_node((PyODictObject *)od, NULL, key, hash);
+    res = _odict_clear_node(_PyODictObject_CAST(od), NULL, key, hash);
     if (res < 0)
         return -1;
     return _PyDict_DelItem_KnownHash(od, key, hash);
@@ -1633,8 +1644,9 @@ typedef struct {
 } odictiterobject;
 
 static void
-odictiter_dealloc(odictiterobject *di)
+odictiter_dealloc(PyObject *op)
 {
+    odictiterobject *di = (odictiterobject*)op;
     _PyObject_GC_UNTRACK(di);
     Py_XDECREF(di->di_odict);
     Py_XDECREF(di->di_current);
@@ -1645,8 +1657,9 @@ odictiter_dealloc(odictiterobject *di)
 }
 
 static int
-odictiter_traverse(odictiterobject *di, visitproc visit, void *arg)
+odictiter_traverse(PyObject *op, visitproc visit, void *arg)
 {
+    odictiterobject *di = (odictiterobject*)op;
     Py_VISIT(di->di_odict);
     Py_VISIT(di->di_current);  /* A key could be any type, not just str. */
     Py_VISIT(di->di_result);
@@ -1709,8 +1722,9 @@ odictiter_nextkey(odictiterobject *di)
 }
 
 static PyObject *
-odictiter_iternext(odictiterobject *di)
+odictiter_iternext(PyObject *op)
 {
+    odictiterobject *di = (odictiterobject*)op;
     PyObject *result, *value;
     PyObject *key = odictiter_nextkey(di);  /* new reference */
 
@@ -1776,8 +1790,10 @@ odictiter_iternext(odictiterobject *di)
 PyDoc_STRVAR(reduce_doc, "Return state information for pickling");
 
 static PyObject *
-odictiter_reduce(odictiterobject *di, PyObject *Py_UNUSED(ignored))
+odictiter_reduce(PyObject *op, PyObject *Py_UNUSED(ignored))
 {
+    odictiterobject *di = (odictiterobject*)op;
+
     /* copy the iterator state */
     odictiterobject tmp = *di;
     Py_XINCREF(tmp.di_odict);
@@ -1794,7 +1810,7 @@ odictiter_reduce(odictiterobject *di, PyObject 
*Py_UNUSED(ignored))
 }
 
 static PyMethodDef odictiter_methods[] = {
-    {"__reduce__", (PyCFunction)odictiter_reduce, METH_NOARGS, reduce_doc},
+    {"__reduce__", odictiter_reduce, METH_NOARGS, reduce_doc},
     {NULL,              NULL}           /* sentinel */
 };
 
@@ -1804,7 +1820,7 @@ PyTypeObject PyODictIter_Type = {
     sizeof(odictiterobject),                  /* tp_basicsize */
     0,                                        /* tp_itemsize */
     /* methods */
-    (destructor)odictiter_dealloc,            /* tp_dealloc */
+    odictiter_dealloc,                        /* tp_dealloc */
     0,                                        /* tp_vectorcall_offset */
     0,                                        /* tp_getattr */
     0,                                        /* tp_setattr */
@@ -1821,12 +1837,12 @@ PyTypeObject PyODictIter_Type = {
     0,                                        /* tp_as_buffer */
     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,  /* tp_flags */
     0,                                        /* tp_doc */
-    (traverseproc)odictiter_traverse,         /* tp_traverse */
+    odictiter_traverse,                       /* tp_traverse */
     0,                                        /* tp_clear */
     0,                                        /* tp_richcompare */
     0,                                        /* tp_weaklistoffset */
     PyObject_SelfIter,                        /* tp_iter */
-    (iternextfunc)odictiter_iternext,         /* tp_iternext */
+    odictiter_iternext,                       /* tp_iternext */
     odictiter_methods,                        /* tp_methods */
     0,
 };
@@ -1872,22 +1888,23 @@ odictkeys_iter(_PyDictViewObject *dv)
     if (dv->dv_dict == NULL) {
         Py_RETURN_NONE;
     }
-    return odictiter_new((PyODictObject *)dv->dv_dict,
+    return odictiter_new(_PyODictObject_CAST(dv->dv_dict),
             _odict_ITER_KEYS);
 }
 
 static PyObject *
-odictkeys_reversed(_PyDictViewObject *dv, PyObject *Py_UNUSED(ignored))
+odictkeys_reversed(PyObject *op, PyObject *Py_UNUSED(ignored))
 {
+    _PyDictViewObject *dv = (_PyDictViewObject*)op;
     if (dv->dv_dict == NULL) {
         Py_RETURN_NONE;
     }
-    return odictiter_new((PyODictObject *)dv->dv_dict,
+    return odictiter_new(_PyODictObject_CAST(dv->dv_dict),
             _odict_ITER_KEYS|_odict_ITER_REVERSED);
 }
 
 static PyMethodDef odictkeys_methods[] = {
-    {"__reversed__", (PyCFunction)odictkeys_reversed, METH_NOARGS, NULL},
+    {"__reversed__", odictkeys_reversed, METH_NOARGS, NULL},
     {NULL,          NULL}           /* sentinel */
 };
 
@@ -1939,22 +1956,23 @@ odictitems_iter(_PyDictViewObject *dv)
     if (dv->dv_dict == NULL) {
         Py_RETURN_NONE;
     }
-    return odictiter_new((PyODictObject *)dv->dv_dict,
+    return odictiter_new(_PyODictObject_CAST(dv->dv_dict),
             _odict_ITER_KEYS|_odict_ITER_VALUES);
 }
 
 static PyObject *
-odictitems_reversed(_PyDictViewObject *dv, PyObject *Py_UNUSED(ignored))
+odictitems_reversed(PyObject *op, PyObject *Py_UNUSED(ignored))
 {
+    _PyDictViewObject *dv = (_PyDictViewObject*)op;
     if (dv->dv_dict == NULL) {
         Py_RETURN_NONE;
     }
-    return odictiter_new((PyODictObject *)dv->dv_dict,
+    return odictiter_new(_PyODictObject_CAST(dv->dv_dict),
             _odict_ITER_KEYS|_odict_ITER_VALUES|_odict_ITER_REVERSED);
 }
 
 static PyMethodDef odictitems_methods[] = {
-    {"__reversed__", (PyCFunction)odictitems_reversed, METH_NOARGS, NULL},
+    {"__reversed__", odictitems_reversed, METH_NOARGS, NULL},
     {NULL,          NULL}           /* sentinel */
 };
 
@@ -2001,27 +2019,29 @@ odictitems_new(PyObject *od, PyObject 
*Py_UNUSED(ignored))
 /* values() */
 
 static PyObject *
-odictvalues_iter(_PyDictViewObject *dv)
+odictvalues_iter(PyObject *op)
 {
+    _PyDictViewObject *dv = (_PyDictViewObject*)op;
     if (dv->dv_dict == NULL) {
         Py_RETURN_NONE;
     }
-    return odictiter_new((PyODictObject *)dv->dv_dict,
+    return odictiter_new(_PyODictObject_CAST(dv->dv_dict),
             _odict_ITER_VALUES);
 }
 
 static PyObject *
-odictvalues_reversed(_PyDictViewObject *dv, PyObject *Py_UNUSED(ignored))
+odictvalues_reversed(PyObject *op, PyObject *Py_UNUSED(ignored))
 {
+    _PyDictViewObject *dv = (_PyDictViewObject*)op;
     if (dv->dv_dict == NULL) {
         Py_RETURN_NONE;
     }
-    return odictiter_new((PyODictObject *)dv->dv_dict,
+    return odictiter_new(_PyODictObject_CAST(dv->dv_dict),
             _odict_ITER_VALUES|_odict_ITER_REVERSED);
 }
 
 static PyMethodDef odictvalues_methods[] = {
-    {"__reversed__", (PyCFunction)odictvalues_reversed, METH_NOARGS, NULL},
+    {"__reversed__", odictvalues_reversed, METH_NOARGS, NULL},
     {NULL,          NULL}           /* sentinel */
 };
 
@@ -2051,7 +2071,7 @@ PyTypeObject PyODictValues_Type = {
     0,                                        /* tp_clear */
     0,                                        /* tp_richcompare */
     0,                                        /* tp_weaklistoffset */
-    (getiterfunc)odictvalues_iter,            /* tp_iter */
+    odictvalues_iter,                         /* tp_iter */
     0,                                        /* tp_iternext */
     odictvalues_methods,                      /* tp_methods */
     0,                                        /* tp_members */

_______________________________________________
Python-checkins mailing list -- python-checkins@python.org
To unsubscribe send an email to python-checkins-le...@python.org
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: arch...@mail-archive.com

Reply via email to