mirror of
https://github.com/python/cpython.git
synced 2025-08-03 08:34:29 +00:00
#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.
This commit is contained in:
parent
73b90a8d61
commit
f43ee81ef2
3 changed files with 20 additions and 1 deletions
|
@ -1155,6 +1155,7 @@ defdict_reduce(defdictobject *dd)
|
|||
*/
|
||||
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 @@ defdict_reduce(defdictobject *dd)
|
|||
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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue