Mercurial > cpython-lru_cache-weakref
diff Modules/_collectionsmodule.c @ 49604:711390d4ac21
#4170: Fix segfault when pickling a defauldict object.
The 2.x dict.iteritems() returns an iterator,
whereas the 3.0 dict.items() returns a "view",
which is iterable, but not an iterator with its __next__ method.
Patch by Hirokazu Yamamoto.
| author | Amaury Forgeot d'Arc <amauryfa@gmail.com> |
|---|---|
| date | Thu, 30 Oct 2008 20:58:42 +0000 |
| parents | 6ae2d4b507a2 |
| children | badb471dbaeb |
line wrap: on
line diff
--- a/Modules/_collectionsmodule.c Wed Oct 29 23:32:33 2008 +0000 +++ b/Modules/_collectionsmodule.c Thu Oct 30 20:58:42 2008 +0000 @@ -1155,6 +1155,7 @@ */ PyObject *args; PyObject *items; + PyObject *iter; PyObject *result; if (dd->default_factory == NULL || dd->default_factory == Py_None) args = PyTuple_New(0); @@ -1167,8 +1168,15 @@ Py_DECREF(args); return NULL; } + iter = PyObject_GetIter(items); + if (iter == NULL) { + Py_DECREF(items); + Py_DECREF(args); + return NULL; + } result = PyTuple_Pack(5, Py_TYPE(dd), args, - Py_None, Py_None, items); + Py_None, Py_None, iter); + Py_DECREF(iter); Py_DECREF(items); Py_DECREF(args); return result;
