summaryrefslogtreecommitdiffstats
path: root/Modules/collectionsmodule.c
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2004-11-09 07:27:35 (GMT)
committerRaymond Hettinger <python@rcn.com>2004-11-09 07:27:35 (GMT)
commit952f8808b264f82b6dbf8e613307769050eba611 (patch)
tree784316b140339338b943e49c6da048d14e6f2347 /Modules/collectionsmodule.c
parent15056a5202c89846d75006d66541d5a634ac79b5 (diff)
downloadcpython-952f8808b264f82b6dbf8e613307769050eba611.zip
cpython-952f8808b264f82b6dbf8e613307769050eba611.tar.gz
cpython-952f8808b264f82b6dbf8e613307769050eba611.tar.bz2
SF patch #1062279: deque pickling problems
(Contributed by Dima Dorfman.) * Support pickling of dictionaries in instances of deque subclasses. * Support pickling of recursive deques.
Diffstat (limited to 'Modules/collectionsmodule.c')
-rw-r--r--Modules/collectionsmodule.c22
1 files changed, 12 insertions, 10 deletions
diff --git a/Modules/collectionsmodule.c b/Modules/collectionsmodule.c
index 10b08f9..ed10999 100644
--- a/Modules/collectionsmodule.c
+++ b/Modules/collectionsmodule.c
@@ -550,19 +550,21 @@ PyDoc_STRVAR(copy_doc, "Return a shallow copy of a deque.");
static PyObject *
deque_reduce(dequeobject *deque)
{
- PyObject *seq, *args, *result;
+ PyObject *dict, *result, *it;
- seq = PySequence_Tuple((PyObject *)deque);
- if (seq == NULL)
- return NULL;
- args = PyTuple_Pack(1, seq);
- if (args == NULL) {
- Py_DECREF(seq);
+ dict = PyObject_GetAttrString((PyObject *)deque, "__dict__");
+ if (dict == NULL) {
+ PyErr_Clear();
+ dict = Py_None;
+ Py_INCREF(dict);
+ }
+ it = PyObject_GetIter((PyObject *)deque);
+ if (it == NULL) {
+ Py_DECREF(dict);
return NULL;
}
- result = PyTuple_Pack(2, deque->ob_type, args);
- Py_DECREF(seq);
- Py_DECREF(args);
+ result = Py_BuildValue("O()ON", deque->ob_type, dict, it);
+ Py_DECREF(dict);
return result;
}