#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
|
@ -2,6 +2,7 @@
|
|||
|
||||
import os
|
||||
import copy
|
||||
import pickle
|
||||
import tempfile
|
||||
import unittest
|
||||
from test import support
|
||||
|
@ -164,6 +165,13 @@ class TestDefaultDict(unittest.TestCase):
|
|||
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)
|
||||
|
|
|
@ -15,6 +15,9 @@ What's New in Python 3.0 beta 5
|
|||
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.
|
||||
|
|
|
@ -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…
Reference in New Issue