diff options
author | Michael W. Hudson <mwh@python.net> | 2002-03-05 13:27:58 (GMT) |
---|---|---|
committer | Michael W. Hudson <mwh@python.net> | 2002-03-05 13:27:58 (GMT) |
commit | 7bb466a1a534e73de11bb044f6910aaf86d78473 (patch) | |
tree | 49119dd5b9644a62143e7b776dc378bcadb32d8f /Objects/structseq.c | |
parent | 58fb23794876c6b58fc3dc75e2a2b420b458d575 (diff) | |
download | cpython-7bb466a1a534e73de11bb044f6910aaf86d78473.zip cpython-7bb466a1a534e73de11bb044f6910aaf86d78473.tar.gz cpython-7bb466a1a534e73de11bb044f6910aaf86d78473.tar.bz2 |
A fix & test for
[ 496873 ] structseqs unpicklable
by adding a __reduce__ method to structseqs.
Will also commit this to the 2.2.1 branch momentarily.
Diffstat (limited to 'Objects/structseq.c')
-rw-r--r-- | Objects/structseq.c | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/Objects/structseq.c b/Objects/structseq.c index 2ab9b52..e5f8e09 100644 --- a/Objects/structseq.c +++ b/Objects/structseq.c @@ -188,6 +188,27 @@ structseq_richcompare(PyObject *obj, PyObject *o2, int op) return result; } +static PyObject * +structseq_reduce(PyStructSequence* self) +{ + PyObject* tup; + long n_fields; + int i; + + n_fields = REAL_SIZE(self); + tup = PyTuple_New(n_fields); + if (!tup) { + return NULL; + } + + for (i = 0; i < n_fields; i++) { + Py_INCREF(self->ob_item[i]); + PyTuple_SET_ITEM(tup, i, self->ob_item[i]); + } + + return Py_BuildValue("(O(O))", self->ob_type, tup); +} + static PySequenceMethods structseq_as_sequence = { (inquiry)structseq_length, (binaryfunc)structseq_concat, /* sq_concat */ @@ -199,6 +220,12 @@ static PySequenceMethods structseq_as_sequence = { (objobjproc)structseq_contains, /* sq_contains */ }; +static PyMethodDef structseq_methods[] = { + {"__reduce__", (PyCFunction)structseq_reduce, + METH_NOARGS, NULL}, + {NULL, NULL} +}; + static PyTypeObject _struct_sequence_template = { PyObject_HEAD_INIT(&PyType_Type) 0, /* ob_size */ @@ -228,7 +255,7 @@ static PyTypeObject _struct_sequence_template = { 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ - 0, /* tp_methods */ + structseq_methods, /* tp_methods */ NULL, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ @@ -282,4 +309,6 @@ PyStructSequence_InitType(PyTypeObject *type, PyStructSequence_Desc *desc) PyInt_FromLong((long) desc->n_in_sequence)); PyDict_SetItemString(dict, real_length_key, PyInt_FromLong((long) n_members)); + PyDict_SetItemString(dict, "__safe_for_unpickling__", + PyInt_FromLong(1)); } |