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