#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:
Amaury Forgeot d'Arc 2008-10-30 20:58:42 +00:00
parent 73b90a8d61
commit f43ee81ef2
3 changed files with 20 additions and 1 deletions

View file

@ -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;