Author: Armin Rigo <[email protected]>
Branch: 
Changeset: r69793:3f834e4349e4
Date: 2014-03-07 21:34 +0100
http://bitbucket.org/pypy/pypy/changeset/3f834e4349e4/

Log:    Support (reasonably) converting a user-supplied "double" directly to
        a time_t, which may be 64-bit even on 32-bit platforms --- notably
        on Windows. Should fix issue1697.

diff --git a/pypy/module/rctime/interp_time.py 
b/pypy/module/rctime/interp_time.py
--- a/pypy/module/rctime/interp_time.py
+++ b/pypy/module/rctime/interp_time.py
@@ -358,14 +358,16 @@
         seconds = pytime.time()
     else:
         seconds = space.float_w(w_seconds)
-    try:
-        seconds = ovfcheck_float_to_int(seconds)
-        t = rffi.r_time_t(seconds)
-        if rffi.cast(lltype.Signed, t) != seconds:
-            raise OverflowError
-    except OverflowError:
+    #
+    t = rffi.cast(rffi.TIME_T, seconds)
+    #
+    # Logic from CPython: How much info did we lose?  We assume that
+    # time_t is an integral type.  If we lost a second or more, the
+    # input doesn't fit in a time_t; call it an error.
+    diff = seconds - rffi.cast(lltype.Float, t)
+    if diff <= -1.0 or diff >= 1.0:
         raise OperationError(space.w_ValueError,
-                             space.wrap("time argument too large"))
+                      space.wrap("timestamp out of range for platform time_t"))
     return t
 
 def _tm_to_tuple(space, t):
diff --git a/pypy/module/rctime/test/test_rctime.py 
b/pypy/module/rctime/test/test_rctime.py
--- a/pypy/module/rctime/test/test_rctime.py
+++ b/pypy/module/rctime/test/test_rctime.py
@@ -59,6 +59,8 @@
         assert 0 <= (t1 - t0) < 1.2
         t = rctime.time()
         assert rctime.gmtime(t) == rctime.gmtime(t)
+        raises(ValueError, rctime.gmtime, 2**64)
+        raises(ValueError, rctime.gmtime, -2**64)
 
     def test_localtime(self):
         import time as rctime
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to