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

Add _PyODictObject_CAST() macro.
This commit is contained in:
Victor Stinner 2025-03-13 11:14:59 +01:00 committed by GitHub
parent fcb750af86
commit d12d8c50cd
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -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 @@ done:
}
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 @@ done:
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 */