From ffa56f44ea93922b33f405275c494705d158035c Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 12 Mar 2025 17:56:55 +0100 Subject: [PATCH 1/3] gh-111178: Fix function signatures in odictobject.c --- Objects/odictobject.c | 96 +++++++++++++++++++++++++------------------ 1 file changed, 56 insertions(+), 40 deletions(-) diff --git a/Objects/odictobject.c b/Objects/odictobject.c index f2d8da0c567878..c36b74779093c3 100644 --- a/Objects/odictobject.c +++ b/Objects/odictobject.c @@ -857,12 +857,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 +870,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 +953,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*)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 +969,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*)op; PyObject *state, *result = NULL; PyObject *items_iter, *items, *args = NULL; @@ -1192,9 +1194,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*)op; + PyDict_Clear(op); _odict_clear_nodes(od); Py_RETURN_NONE; } @@ -1208,8 +1211,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*)op; _ODictNode *node; PyObject *od_copy; @@ -1268,8 +1272,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*)op; return odictiter_new(od, _odict_ITER_KEYS|_odict_ITER_REVERSED); } @@ -1330,9 +1335,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 +1350,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 +1382,9 @@ static PyGetSetDef odict_getset[] = { /* tp_dealloc */ static void -odict_dealloc(PyODictObject *self) +odict_dealloc(PyObject *op) { + PyODictObject *self = (PyODictObject*)op; PyObject_GC_UnTrack(self); Py_TRASHCAN_BEGIN(self, odict_dealloc) @@ -1395,8 +1401,9 @@ odict_dealloc(PyODictObject *self) /* tp_repr */ static PyObject * -odict_repr(PyODictObject *self) +odict_repr(PyObject *op) { + PyODictObject *self = (PyODictObject*)op; int i; PyObject *result = NULL, *dcopy = NULL; @@ -1431,8 +1438,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*)op; _ODictNode *node; Py_VISIT(od->od_inst_dict); @@ -1445,8 +1453,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*)op; Py_CLEAR(od->od_inst_dict); PyDict_Clear((PyObject *)od); _odict_clear_nodes(od); @@ -1492,9 +1501,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*)op, _odict_ITER_KEYS); } /* tp_init */ @@ -1530,12 +1539,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 +1556,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 +1570,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 */ @@ -1633,8 +1642,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 +1655,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 +1720,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 +1788,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 +1808,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 +1818,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 +1835,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, }; @@ -2001,8 +2015,9 @@ 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; } @@ -2011,8 +2026,9 @@ odictvalues_iter(_PyDictViewObject *dv) } 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; } @@ -2021,7 +2037,7 @@ odictvalues_reversed(_PyDictViewObject *dv, PyObject *Py_UNUSED(ignored)) } static PyMethodDef odictvalues_methods[] = { - {"__reversed__", (PyCFunction)odictvalues_reversed, METH_NOARGS, NULL}, + {"__reversed__", odictvalues_reversed, METH_NOARGS, NULL}, {NULL, NULL} /* sentinel */ }; @@ -2051,7 +2067,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 */ From c27132d20cc240a21734e9a3f3aadee9739e8985 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 12 Mar 2025 18:17:26 +0100 Subject: [PATCH 2/3] Fix more functions --- Objects/odictobject.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Objects/odictobject.c b/Objects/odictobject.c index c36b74779093c3..268037715fc350 100644 --- a/Objects/odictobject.c +++ b/Objects/odictobject.c @@ -1891,8 +1891,9 @@ odictkeys_iter(_PyDictViewObject *dv) } 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; } @@ -1901,7 +1902,7 @@ odictkeys_reversed(_PyDictViewObject *dv, PyObject *Py_UNUSED(ignored)) } static PyMethodDef odictkeys_methods[] = { - {"__reversed__", (PyCFunction)odictkeys_reversed, METH_NOARGS, NULL}, + {"__reversed__", odictkeys_reversed, METH_NOARGS, NULL}, {NULL, NULL} /* sentinel */ }; @@ -1958,8 +1959,9 @@ odictitems_iter(_PyDictViewObject *dv) } 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; } @@ -1968,7 +1970,7 @@ odictitems_reversed(_PyDictViewObject *dv, PyObject *Py_UNUSED(ignored)) } static PyMethodDef odictitems_methods[] = { - {"__reversed__", (PyCFunction)odictitems_reversed, METH_NOARGS, NULL}, + {"__reversed__", odictitems_reversed, METH_NOARGS, NULL}, {NULL, NULL} /* sentinel */ }; From 1a79c3e06b6b11cd4439c858297099aecbc2fc90 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 13 Mar 2025 10:50:14 +0100 Subject: [PATCH 3/3] Add _PyODictObject_CAST() --- Objects/odictobject.c | 48 ++++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/Objects/odictobject.c b/Objects/odictobject.c index 268037715fc350..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)) @@ -955,7 +957,7 @@ PyDoc_STRVAR(odict_sizeof__doc__, ""); static PyObject * odict_sizeof(PyObject *op, PyObject *Py_UNUSED(ignored)) { - PyODictObject *od = (PyODictObject*)op; + 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)) { @@ -971,7 +973,7 @@ PyDoc_STRVAR(odict_reduce__doc__, "Return state information for pickling"); static PyObject * odict_reduce(PyObject *op, PyObject *Py_UNUSED(ignored)) { - register PyODictObject *od = (PyODictObject*)op; + register PyODictObject *od = _PyODictObject_CAST(op); PyObject *state, *result = NULL; PyObject *items_iter, *items, *args = NULL; @@ -1065,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; } @@ -1196,7 +1198,7 @@ PyDoc_STRVAR(odict_clear__doc__, static PyObject * odict_clear(PyObject *op, PyObject *Py_UNUSED(ignored)) { - register PyODictObject *od = (PyODictObject*)op; + register PyODictObject *od = _PyODictObject_CAST(op); PyDict_Clear(op); _odict_clear_nodes(od); Py_RETURN_NONE; @@ -1213,7 +1215,7 @@ PyDoc_STRVAR(odict_copy__doc__, "od.copy() -> a shallow copy of od"); static PyObject * odict_copy(PyObject *op, PyObject *Py_UNUSED(ignored)) { - register PyODictObject *od = (PyODictObject*)op; + register PyODictObject *od = _PyODictObject_CAST(op); _ODictNode *node; PyObject *od_copy; @@ -1274,7 +1276,7 @@ static PyObject * odictiter_new(PyODictObject *, int); static PyObject * odict_reversed(PyObject *op, PyObject *Py_UNUSED(ignored)) { - PyODictObject *od = (PyODictObject*)op; + PyODictObject *od = _PyODictObject_CAST(op); return odictiter_new(od, _odict_ITER_KEYS|_odict_ITER_REVERSED); } @@ -1384,7 +1386,7 @@ static PyGetSetDef odict_getset[] = { static void odict_dealloc(PyObject *op) { - PyODictObject *self = (PyODictObject*)op; + PyODictObject *self = _PyODictObject_CAST(op); PyObject_GC_UnTrack(self); Py_TRASHCAN_BEGIN(self, odict_dealloc) @@ -1403,7 +1405,7 @@ odict_dealloc(PyObject *op) static PyObject * odict_repr(PyObject *op) { - PyODictObject *self = (PyODictObject*)op; + PyODictObject *self = _PyODictObject_CAST(op); int i; PyObject *result = NULL, *dcopy = NULL; @@ -1440,7 +1442,7 @@ PyDoc_STRVAR(odict_doc, static int odict_traverse(PyObject *op, visitproc visit, void *arg) { - PyODictObject *od = (PyODictObject*)op; + PyODictObject *od = _PyODictObject_CAST(op); _ODictNode *node; Py_VISIT(od->od_inst_dict); @@ -1455,7 +1457,7 @@ odict_traverse(PyObject *op, visitproc visit, void *arg) static int odict_tp_clear(PyObject *op) { - PyODictObject *od = (PyODictObject*)op; + PyODictObject *od = _PyODictObject_CAST(op); Py_CLEAR(od->od_inst_dict); PyDict_Clear((PyObject *)od); _odict_clear_nodes(od); @@ -1487,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; @@ -1503,7 +1505,7 @@ odict_richcompare(PyObject *v, PyObject *w, int op) static PyObject * odict_iter(PyObject *op) { - return odictiter_new((PyODictObject*)op, _odict_ITER_KEYS); + return odictiter_new(_PyODictObject_CAST(op), _odict_ITER_KEYS); } /* tp_init */ @@ -1593,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(); @@ -1620,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); @@ -1886,7 +1888,7 @@ 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); } @@ -1897,7 +1899,7 @@ odictkeys_reversed(PyObject *op, PyObject *Py_UNUSED(ignored)) 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); } @@ -1954,7 +1956,7 @@ 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); } @@ -1965,7 +1967,7 @@ odictitems_reversed(PyObject *op, PyObject *Py_UNUSED(ignored)) 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); } @@ -2023,7 +2025,7 @@ odictvalues_iter(PyObject *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); } @@ -2034,7 +2036,7 @@ odictvalues_reversed(PyObject *op, PyObject *Py_UNUSED(ignored)) 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); }