[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 */