https://github.com/python/cpython/commit/d12d8c50cddeb79f8d6e3d26a33f8f6b14bb4071
commit: d12d8c50cddeb79f8d6e3d26a33f8f6b14bb4071
branch: main
author: Victor Stinner <[email protected]>
committer: vstinner <[email protected]>
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 -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]