[Python-checkins] cpython: Issue #23517: Fix _PyTime_ObjectToDenominator()

victor.stinner python-checkins at python.org
Wed Sep 2 10:40:58 CEST 2015


https://hg.python.org/cpython/rev/700303850cd7
changeset: 97571:700303850cd7
user: Victor Stinner <victor.stinner at gmail.com>
date: Wed Sep 02 10:37:46 2015 +0200
summary:
 Issue #23517: Fix _PyTime_ObjectToDenominator()
* initialize numerator on overflow error ensure that numerator is smaller than
* denominator.
files:
 Python/pytime.c | 37 ++++++++++++++++++-------------------
 1 files changed, 18 insertions(+), 19 deletions(-)
diff --git a/Python/pytime.c b/Python/pytime.c
--- a/Python/pytime.c
+++ b/Python/pytime.c
@@ -60,6 +60,7 @@
 #endif
 }
 
+/* Round to nearest with ties going away from zero (_PyTime_ROUND_HALF_UP). */
 static double
 _PyTime_RoundHalfUp(double x)
 {
@@ -81,32 +82,31 @@
 
 floatpart = modf(d, &intpart);
 if (floatpart < 0) {
- floatpart = 1.0 + floatpart;
+ floatpart += 1.0;
 intpart -= 1.0;
 }
 
 floatpart *= denominator;
 if (round == _PyTime_ROUND_HALF_UP)
 floatpart = _PyTime_RoundHalfUp(floatpart);
- else if (round == _PyTime_ROUND_CEILING) {
+ else if (round == _PyTime_ROUND_CEILING)
 floatpart = ceil(floatpart);
- if (floatpart >= denominator) {
- floatpart = 0.0;
- intpart += 1.0;
- }
+ else
+ floatpart = floor(floatpart);
+ if (floatpart >= denominator) {
+ floatpart -= denominator;
+ intpart += 1.0;
 }
- else {
- floatpart = floor(floatpart);
- }
+ assert(0.0 <= floatpart && floatpart < denominator);
 
 *sec = (time_t)intpart;
+ *numerator = (long)floatpart;
+
 err = intpart - (double)*sec;
 if (err <= -1.0 || err >= 1.0) {
 error_time_t_overflow();
 return -1;
 }
-
- *numerator = (long)floatpart;
 return 0;
 }
 
@@ -123,9 +123,9 @@
 }
 else {
 *sec = _PyLong_AsTime_t(obj);
+ *numerator = 0;
 if (*sec == (time_t)-1 && PyErr_Occurred())
 return -1;
- *numerator = 0;
 return 0;
 }
 }
@@ -167,7 +167,7 @@
 {
 int res;
 res = _PyTime_ObjectToDenominator(obj, sec, nsec, 1e9, round);
- assert(0 <= *nsec && *nsec < SEC_TO_NS );
+ assert(0 <= *nsec && *nsec < SEC_TO_NS);
 return res;
 }
 
@@ -177,7 +177,7 @@
 {
 int res;
 res = _PyTime_ObjectToDenominator(obj, sec, usec, 1e6, round);
- assert(0 <= *usec && *usec < SEC_TO_US );
+ assert(0 <= *usec && *usec < SEC_TO_US);
 return res;
 }
 
@@ -444,12 +444,11 @@
 tv->tv_sec += 1;
 }
 
+ assert(0 <= usec && usec < SEC_TO_US);
+ tv->tv_usec = usec;
+
 if (res && raise)
 _PyTime_overflow();
-
- assert(0 <= usec && usec <= 999999);
-
- tv->tv_usec = usec;
 return res;
 }
 
@@ -484,7 +483,7 @@
 }
 ts->tv_nsec = nsec;
 
- assert(0 <= ts->tv_nsec && ts->tv_nsec <= 999999999);
+ assert(0 <= ts->tv_nsec && ts->tv_nsec < SEC_TO_NS);
 return 0;
 }
 #endif
-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /