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;