diff -r b9a0ecae02cb Lib/test/test_datetime.py --- a/Lib/test/test_datetime.py Sat Oct 10 10:52:35 2015 +0000 +++ b/Lib/test/test_datetime.py Mon Oct 12 22:37:04 2015 +0300 @@ -1413,11 +1413,12 @@ class TestDateTime(TestDate): def test_pickling(self): args = 6, 7, 23, 20, 59, 1, 64**2 - orig = self.theclass(*args) - for pickler, unpickler, proto in pickle_choices: - green = pickler.dumps(orig, proto) - derived = unpickler.loads(green) - self.assertEqual(orig, derived) + for i in range(3, len(args)): + orig = self.theclass(*args[:i]) + for pickler, unpickler, proto in pickle_choices: + green = pickler.dumps(orig, proto) + derived = unpickler.loads(green) + self.assertEqual(orig, derived) def test_more_pickling(self): a = self.theclass(2003, 2, 7, 16, 48, 37, 444116) @@ -1430,11 +1431,12 @@ class TestDateTime(TestDate): def test_pickling_subclass_datetime(self): args = 6, 7, 23, 20, 59, 1, 64**2 - orig = SubclassDatetime(*args) - for pickler, unpickler, proto in pickle_choices: - green = pickler.dumps(orig, proto) - derived = unpickler.loads(green) - self.assertEqual(orig, derived) + for i in range(3, len(args)): + orig = SubclassDatetime(*args[:i]) + for pickler, unpickler, proto in pickle_choices: + green = pickler.dumps(orig, proto) + derived = unpickler.loads(green) + self.assertEqual(orig, derived) def test_more_compare(self): # The test_compare() inherited from TestDate covers the error cases. @@ -1910,19 +1912,21 @@ class TestTime(HarmlessMixedComparison, def test_pickling(self): args = 20, 59, 16, 64**2 - orig = self.theclass(*args) - for pickler, unpickler, proto in pickle_choices: - green = pickler.dumps(orig, proto) - derived = unpickler.loads(green) - self.assertEqual(orig, derived) + for i in range(len(args)): + orig = self.theclass(*args[:i]) + for pickler, unpickler, proto in pickle_choices: + green = pickler.dumps(orig, proto) + derived = unpickler.loads(green) + self.assertEqual(orig, derived) def test_pickling_subclass_time(self): args = 20, 59, 16, 64**2 - orig = SubclassTime(*args) - for pickler, unpickler, proto in pickle_choices: - green = pickler.dumps(orig, proto) - derived = unpickler.loads(green) - self.assertEqual(orig, derived) + for i in range(len(args)): + orig = SubclassTime(*args[:i]) + for pickler, unpickler, proto in pickle_choices: + green = pickler.dumps(orig, proto) + derived = unpickler.loads(green) + self.assertEqual(orig, derived) def test_bool(self): cls = self.theclass diff -r b9a0ecae02cb Modules/datetimemodule.c --- a/Modules/datetimemodule.c Sat Oct 10 10:52:35 2015 +0000 +++ b/Modules/datetimemodule.c Mon Oct 12 22:37:04 2015 +0300 @@ -2694,10 +2694,8 @@ date_weekday(PyDateTime_Date *self) static PyObject * date_getstate(PyDateTime_Date *self) { - return Py_BuildValue( - "(N)", - PyString_FromStringAndSize((char *)self->data, - _PyDateTime_DATE_DATASIZE)); + return Py_BuildValue("(iii)", + GET_YEAR(self), GET_MONTH(self), GET_DAY(self)); } static PyObject * @@ -3492,19 +3490,27 @@ time_nonzero(PyDateTime_Time *self) static PyObject * time_getstate(PyDateTime_Time *self) { - PyObject *basestate; - PyObject *result = NULL; - - basestate = PyString_FromStringAndSize((char *)self->data, - _PyDateTime_TIME_DATASIZE); - if (basestate != NULL) { - if (! HASTZINFO(self) || self->tzinfo == Py_None) - result = PyTuple_Pack(1, basestate); - else - result = PyTuple_Pack(2, basestate, self->tzinfo); - Py_DECREF(basestate); - } - return result; + if (HASTZINFO(self) && self->tzinfo != Py_None) + return Py_BuildValue("(iiiiO)", + TIME_GET_HOUR(self), TIME_GET_MINUTE(self), + TIME_GET_SECOND(self), TIME_GET_MICROSECOND(self), + self->tzinfo); + else if (TIME_GET_MICROSECOND(self)) + return Py_BuildValue("(iiii)", + TIME_GET_HOUR(self), TIME_GET_MINUTE(self), + TIME_GET_SECOND(self), TIME_GET_MICROSECOND(self)); + else if (TIME_GET_SECOND(self)) + return Py_BuildValue("(iii)", + TIME_GET_HOUR(self), TIME_GET_MINUTE(self), + TIME_GET_SECOND(self)); + else if (TIME_GET_MINUTE(self)) + return Py_BuildValue("(ii)", + TIME_GET_HOUR(self), TIME_GET_MINUTE(self)); + else if (TIME_GET_HOUR(self)) + return Py_BuildValue("(i)", + TIME_GET_HOUR(self)); + else + return Py_BuildValue("()"); } static PyObject * @@ -4573,19 +4579,33 @@ datetime_utctimetuple(PyDateTime_DateTim static PyObject * datetime_getstate(PyDateTime_DateTime *self) { - PyObject *basestate; - PyObject *result = NULL; - - basestate = PyString_FromStringAndSize((char *)self->data, - _PyDateTime_DATETIME_DATASIZE); - if (basestate != NULL) { - if (! HASTZINFO(self) || self->tzinfo == Py_None) - result = PyTuple_Pack(1, basestate); - else - result = PyTuple_Pack(2, basestate, self->tzinfo); - Py_DECREF(basestate); - } - return result; + if (HASTZINFO(self) && self->tzinfo != Py_None) + return Py_BuildValue("(iiiiiiiO)", + GET_YEAR(self), GET_MONTH(self), GET_DAY(self), + DATE_GET_HOUR(self), DATE_GET_MINUTE(self), + DATE_GET_SECOND(self), DATE_GET_MICROSECOND(self), + self->tzinfo); + else if (DATE_GET_MICROSECOND(self)) + return Py_BuildValue("(iiiiiii)", + GET_YEAR(self), GET_MONTH(self), GET_DAY(self), + DATE_GET_HOUR(self), DATE_GET_MINUTE(self), + DATE_GET_SECOND(self), DATE_GET_MICROSECOND(self)); + else if (DATE_GET_SECOND(self)) + return Py_BuildValue("(iiiiii)", + GET_YEAR(self), GET_MONTH(self), GET_DAY(self), + DATE_GET_HOUR(self), DATE_GET_MINUTE(self), + DATE_GET_SECOND(self)); + else if (DATE_GET_MINUTE(self)) + return Py_BuildValue("(iiiii)", + GET_YEAR(self), GET_MONTH(self), GET_DAY(self), + DATE_GET_HOUR(self), DATE_GET_MINUTE(self)); + else if (DATE_GET_HOUR(self)) + return Py_BuildValue("(iiii)", + GET_YEAR(self), GET_MONTH(self), GET_DAY(self), + DATE_GET_HOUR(self)); + else + return Py_BuildValue("(iii)", + GET_YEAR(self), GET_MONTH(self), GET_DAY(self)); } static PyObject *