[Python-3000-checkins] r67048 - in python/branches/py3k: Lib/test/test_defaultdict.py Misc/NEWS Modules/_collectionsmodule.c

amaury.forgeotdarc python-3000-checkins at python.org
Fri Oct 31 00:47:29 CET 2008


Author: amaury.forgeotdarc
Date: Thu Oct 30 21:58:42 2008
New Revision: 67048

Log:
#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.


Modified:
   python/branches/py3k/Lib/test/test_defaultdict.py
   python/branches/py3k/Misc/NEWS
   python/branches/py3k/Modules/_collectionsmodule.c

Modified: python/branches/py3k/Lib/test/test_defaultdict.py
==============================================================================
--- python/branches/py3k/Lib/test/test_defaultdict.py	(original)
+++ python/branches/py3k/Lib/test/test_defaultdict.py	Thu Oct 30 21:58:42 2008
@@ -2,6 +2,7 @@
 
 import os
 import copy
+import pickle
 import tempfile
 import unittest
 from test import support
@@ -164,6 +165,13 @@
         finally:
             os.remove(tfn)
 
+    def test_pickleing(self):
+        d = defaultdict(int)
+        d[1]
+        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
+            s = pickle.dumps(d, proto)
+            o = pickle.loads(s)
+            self.assertEqual(d, o)
 
 def test_main():
     support.run_unittest(TestDefaultDict)

Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS	(original)
+++ python/branches/py3k/Misc/NEWS	Thu Oct 30 21:58:42 2008
@@ -15,6 +15,9 @@
 Core and Builtins
 -----------------
 
+- Issue #4170: Pickling a collections.defaultdict object would crash the
+  interpreter.
+
 - Issue #4146: Compilation on OpenBSD has been restored.
 
 - Issue #3574: compile() incorrectly handled source code encoded as Latin-1.

Modified: python/branches/py3k/Modules/_collectionsmodule.c
==============================================================================
--- python/branches/py3k/Modules/_collectionsmodule.c	(original)
+++ python/branches/py3k/Modules/_collectionsmodule.c	Thu Oct 30 21:58:42 2008
@@ -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;


More information about the Python-3000-checkins mailing list