Move assertion inside _PyTime_ObjectToTimeval()
Change also _PyTime_FromSeconds() assertion to ensure that the _PyTime_t type is used.
This commit is contained in:
parent
53e137c8dd
commit
bbdda21a7a
|
@ -4100,7 +4100,6 @@ datetime_from_timestamp(PyObject *cls, TM_FUNC f, PyObject *timestamp,
|
||||||
if (_PyTime_ObjectToTimeval(timestamp,
|
if (_PyTime_ObjectToTimeval(timestamp,
|
||||||
&timet, &us, _PyTime_ROUND_FLOOR) == -1)
|
&timet, &us, _PyTime_ROUND_FLOOR) == -1)
|
||||||
return NULL;
|
return NULL;
|
||||||
assert(0 <= us && us <= 999999);
|
|
||||||
|
|
||||||
return datetime_from_timet_and_us(cls, f, timet, (int)us, tzinfo);
|
return datetime_from_timet_and_us(cls, f, timet, (int)us, tzinfo);
|
||||||
}
|
}
|
||||||
|
|
|
@ -101,7 +101,8 @@ static int
|
||||||
_PyTime_ObjectToDenominator(PyObject *obj, time_t *sec, long *numerator,
|
_PyTime_ObjectToDenominator(PyObject *obj, time_t *sec, long *numerator,
|
||||||
double denominator, _PyTime_round_t round)
|
double denominator, _PyTime_round_t round)
|
||||||
{
|
{
|
||||||
assert(denominator <= LONG_MAX);
|
assert(denominator <= (double)LONG_MAX);
|
||||||
|
|
||||||
if (PyFloat_Check(obj)) {
|
if (PyFloat_Check(obj)) {
|
||||||
double d = PyFloat_AsDouble(obj);
|
double d = PyFloat_AsDouble(obj);
|
||||||
return _PyTime_DoubleToDenominator(d, sec, numerator,
|
return _PyTime_DoubleToDenominator(d, sec, numerator,
|
||||||
|
@ -149,14 +150,20 @@ int
|
||||||
_PyTime_ObjectToTimespec(PyObject *obj, time_t *sec, long *nsec,
|
_PyTime_ObjectToTimespec(PyObject *obj, time_t *sec, long *nsec,
|
||||||
_PyTime_round_t round)
|
_PyTime_round_t round)
|
||||||
{
|
{
|
||||||
return _PyTime_ObjectToDenominator(obj, sec, nsec, 1e9, round);
|
int res;
|
||||||
|
res = _PyTime_ObjectToDenominator(obj, sec, nsec, 1e9, round);
|
||||||
|
assert(0 <= *nsec && *nsec < SEC_TO_NS );
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
_PyTime_ObjectToTimeval(PyObject *obj, time_t *sec, long *usec,
|
_PyTime_ObjectToTimeval(PyObject *obj, time_t *sec, long *usec,
|
||||||
_PyTime_round_t round)
|
_PyTime_round_t round)
|
||||||
{
|
{
|
||||||
return _PyTime_ObjectToDenominator(obj, sec, usec, 1e6, round);
|
int res;
|
||||||
|
res = _PyTime_ObjectToDenominator(obj, sec, usec, 1e6, round);
|
||||||
|
assert(0 <= *usec && *usec < SEC_TO_US );
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -170,12 +177,13 @@ _PyTime_t
|
||||||
_PyTime_FromSeconds(int seconds)
|
_PyTime_FromSeconds(int seconds)
|
||||||
{
|
{
|
||||||
_PyTime_t t;
|
_PyTime_t t;
|
||||||
|
t = (_PyTime_t)seconds;
|
||||||
/* ensure that integer overflow cannot happen, int type should have 32
|
/* ensure that integer overflow cannot happen, int type should have 32
|
||||||
bits, whereas _PyTime_t type has at least 64 bits (SEC_TO_MS takes 30
|
bits, whereas _PyTime_t type has at least 64 bits (SEC_TO_MS takes 30
|
||||||
bits). */
|
bits). */
|
||||||
assert((seconds >= 0 && seconds <= _PyTime_MAX / SEC_TO_NS)
|
assert((t >= 0 && t <= _PyTime_MAX / SEC_TO_NS)
|
||||||
|| (seconds < 0 && seconds >= _PyTime_MIN / SEC_TO_NS));
|
|| (t < 0 && t >= _PyTime_MIN / SEC_TO_NS));
|
||||||
t = (_PyTime_t)seconds * SEC_TO_NS;
|
t *= SEC_TO_NS;
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue