From 46bfc4121ac28c7a63d79b0aa21beee252717a78 Mon Sep 17 00:00:00 2001 From: Tim Peters Date: Sun, 20 Jun 2004 02:50:16 +0000 Subject: Bug 975996: Add _PyTime_DoubleToTimet to C API New include file timefuncs.h exports private API function _PyTime_DoubleToTimet() from timemodule.c. timemodule should export some other functions too (look for painful bits in datetimemodule.c). Added insane-argument checking to datetime's assorted fromtimestamp() and utcfromtimestamp() methods. Added insane-argument tests of these to test_datetime, and insane-argument tests for ctime(), localtime() and gmtime() to test_time. --- Modules/datetimemodule.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) (limited to 'Modules/datetimemodule.c') diff --git a/Modules/datetimemodule.c b/Modules/datetimemodule.c index 7f38d1a645..d9cf6041ea 100644 --- a/Modules/datetimemodule.c +++ b/Modules/datetimemodule.c @@ -8,6 +8,7 @@ #include +#include "timefuncs.h" #include "datetime.h" /* We require that C int be at least 32 bits, and use int virtually @@ -2226,11 +2227,15 @@ date_new(PyTypeObject *type, PyObject *args, PyObject *kw) /* Return new date from localtime(t). */ static PyObject * -date_local_from_time_t(PyObject *cls, time_t t) +date_local_from_time_t(PyObject *cls, double ts) { struct tm *tm; + time_t t; PyObject *result = NULL; + t = _PyTime_DoubleToTimet(ts); + if (t == (time_t)-1 && PyErr_Occurred()) + return NULL; tm = localtime(&t); if (tm) result = PyObject_CallFunction(cls, "iii", @@ -2278,7 +2283,7 @@ date_fromtimestamp(PyObject *cls, PyObject *args) PyObject *result = NULL; if (PyArg_ParseTuple(args, "d:fromtimestamp", ×tamp)) - result = date_local_from_time_t(cls, (time_t)timestamp); + result = date_local_from_time_t(cls, timestamp); return result; } @@ -3654,10 +3659,15 @@ static PyObject * datetime_from_timestamp(PyObject *cls, TM_FUNC f, double timestamp, PyObject *tzinfo) { - time_t timet = (time_t)timestamp; - double fraction = timestamp - (double)timet; - int us = (int)round_to_long(fraction * 1e6); + time_t timet; + double fraction; + int us; + timet = _PyTime_DoubleToTimet(timestamp); + if (timet == (time_t)-1 && PyErr_Occurred()) + return NULL; + fraction = timestamp - (double)timet; + us = (int)round_to_long(fraction * 1e6); return datetime_from_timet_and_us(cls, f, timet, us, tzinfo); } -- cgit v1.2.1