[Python-checkins] python/nondist/sandbox/datetime obj_delta.c,1.9,1.10
tim_one@users.sourceforge.net
tim_one@users.sourceforge.net
Sun, 01 Dec 2002 16:32:24 -0800
Update of /cvsroot/python/python/nondist/sandbox/datetime
In directory sc8-pr-cvs1:/tmp/cvs-serv27769
Modified Files:
obj_delta.c
Log Message:
Implemented __getstate__ and __setstate__ for timedelta.
PROBLEM: This was intended to support pickling, but doesn't work for
that purpose (see the XXX comments). Turns out I have no idea how to
pickle a new-style instance of a type coded in C (it's easy if coded in
Python).
Index: obj_delta.c
===================================================================
RCS file: /cvsroot/python/python/nondist/sandbox/datetime/obj_delta.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -C2 -d -r1.9 -r1.10
*** obj_delta.c 1 Dec 2002 23:49:56 -0000 1.9
--- obj_delta.c 2 Dec 2002 00:32:22 -0000 1.10
***************
*** 563,578 ****
}
#define OFFSET(field) offsetof(PyDateTime_Delta, field)
static PyMemberDef delta_members[] = {
{"days", T_LONG, OFFSET(days), READONLY,
! "Number os days."},
{"seconds", T_LONG, OFFSET(seconds), READONLY,
! "Number of seconds (less than 1 day)."},
{"microseconds", T_LONG, OFFSET(microseconds), READONLY,
! "Number of microseconds (less than 1 second)."},
{NULL}
};
static char delta_doc[] =
"Difference between two datetime values.";
--- 563,623 ----
}
+ /* XXX Broken attempt to get pickles working. An attempt to pickle
+ * XXX craps out in
+ * XXX
+ * XXX if base is self.__class__:
+ * XXX raise TypeError, "can't pickle %s objects" % base.__name__
+ * XXX
+ * XXX in Python's copy_reg.py. How to fix?
+ */
+ static PyObject *
+ delta_getstate(PyDateTime_Delta *self, PyObject *args)
+ {
+ if (!PyArg_ParseTuple(args, ":getstate"))
+ return NULL;
+ return Py_BuildValue("lll", GET_TD_DAYS(self),
+ GET_TD_SECONDS(self),
+ GET_TD_MICROSECONDS(self));
+ }
+
+ static PyObject *
+ delta_setstate(PyDateTime_Delta *self, PyObject *args)
+ {
+ long day;
+ long second;
+ long us;
+
+ if (!PyArg_ParseTuple(args, "lll", &day, &second, &us))
+ return NULL;
+
+ self->hashcode = -1;
+ SET_TD_DAYS(self, day);
+ SET_TD_SECONDS(self, second);
+ SET_TD_MICROSECONDS(self, us);
+
+ Py_INCREF(Py_None);
+ return Py_None;
+ }
+
#define OFFSET(field) offsetof(PyDateTime_Delta, field)
static PyMemberDef delta_members[] = {
{"days", T_LONG, OFFSET(days), READONLY,
! PyDoc_STR("Number of days.")},
{"seconds", T_LONG, OFFSET(seconds), READONLY,
! PyDoc_STR("Number of seconds (>= 0 and less than 1 day).")},
{"microseconds", T_LONG, OFFSET(microseconds), READONLY,
! PyDoc_STR("Number of microseconds (>= and less than 1 second).")},
{NULL}
};
+ static PyMethodDef delta_methods[] = {
+ {"__getstate__", (PyCFunction)delta_getstate, METH_VARARGS,
+ PyDoc_STR("__getstate__() -> state")},
+ {"__setstate__", (PyCFunction)delta_setstate, METH_VARARGS,
+ PyDoc_STR("__setstate__(state)")},
+ {NULL, NULL},
+ };
+
static char delta_doc[] =
"Difference between two datetime values.";
***************
*** 647,651 ****
0, /* tp_iter */
0, /* tp_iternext */
! 0, /* tp_methods */
delta_members, /* tp_members */
0, /* tp_getset */
--- 692,696 ----
0, /* tp_iter */
0, /* tp_iternext */
! delta_methods, /* tp_methods */
delta_members, /* tp_members */
0, /* tp_getset */