amaury.forgeotdarc
2008-10-30 23:47:29 UTC
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;
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;