summaryrefslogtreecommitdiffstats
path: root/Objects/structseq.c
diff options
context:
space:
mode:
authorMichael W. Hudson <mwh@python.net>2002-03-05 13:27:58 (GMT)
committerMichael W. Hudson <mwh@python.net>2002-03-05 13:27:58 (GMT)
commit7bb466a1a534e73de11bb044f6910aaf86d78473 (patch)
tree49119dd5b9644a62143e7b776dc378bcadb32d8f /Objects/structseq.c
parent58fb23794876c6b58fc3dc75e2a2b420b458d575 (diff)
downloadcpython-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.c31
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));
}