[pypy-commit] pypy merge-2.7.2: Fix for time.mktime, -1 is a valid return value in some cases.

alex_gaynor noreply at buildbot.pypy.org
Sun Jan 22 19:09:51 CET 2012


Author: Alex Gaynor <alex.gaynor at gmail.com>
Branch: merge-2.7.2
Changeset: r51649:a0e53cbd4f7c
Date: 2012-01-22 12:09 -0600
http://bitbucket.org/pypy/pypy/changeset/a0e53cbd4f7c/

Log:	Fix for time.mktime, -1 is a valid return value in some cases.

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
@@ -498,8 +498,11 @@
     Convert a time tuple in local time to seconds since the Epoch."""
 
     buf = _gettmarg(space, w_tup, allowNone=False)
+    rffi.setintfield(buf, "c_tm_wday", -1)
     tt = c_mktime(buf)
-    if tt == -1:
+    # A return value of -1 does not necessarily mean an error, but tm_wday
+    # cannot remain set to -1 if mktime succeeds.
+    if tt == -1 and rffi.getintfield(buf, "c_tm_wday") == -1:
         raise OperationError(space.w_OverflowError,
             space.wrap("mktime argument out of range"))
 
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
@@ -14,7 +14,7 @@
         assert isinstance(rctime.timezone, int)
         assert isinstance(rctime.tzname, tuple)
         assert isinstance(rctime.__doc__, str)
-    
+
     def test_sleep(self):
         import time as rctime
         import sys
@@ -46,7 +46,7 @@
         assert isinstance(res, str)
         rctime.ctime(rctime.time())
         raises(ValueError, rctime.ctime, 1E200)
-    
+
     def test_gmtime(self):
         import time as rctime
         raises(TypeError, rctime.gmtime, "foo")
@@ -75,7 +75,7 @@
         assert 0 <= (t1 - t0) < 1.2
         t = rctime.time()
         assert rctime.localtime(t) == rctime.localtime(t)
-    
+
     def test_mktime(self):
         import time as rctime
         import os, sys
@@ -85,30 +85,32 @@
         raises(TypeError, rctime.mktime, (1, 2, 3, 4, 5, 6, 'f', 8, 9))
         res = rctime.mktime(rctime.localtime())
         assert isinstance(res, float)
-        
+
         ltime = rctime.localtime()
         rctime.accept2dyear == 0
         ltime = list(ltime)
         ltime[0] = 1899
         raises(ValueError, rctime.mktime, tuple(ltime))
         rctime.accept2dyear == 1
-    
+
         ltime = list(ltime)
         ltime[0] = 67
         ltime = tuple(ltime)
         if os.name != "nt" and sys.maxint < 1<<32:   # time_t may be 64bit
             raises(OverflowError, rctime.mktime, ltime)
-    
+
         ltime = list(ltime)
         ltime[0] = 100
         raises(ValueError, rctime.mktime, tuple(ltime))
-    
+
         t = rctime.time()
         assert long(rctime.mktime(rctime.localtime(t))) == long(t)
         assert long(rctime.mktime(rctime.gmtime(t))) - rctime.timezone == long(t)
         ltime = rctime.localtime()
         assert rctime.mktime(tuple(ltime)) == rctime.mktime(ltime)
-    
+
+        assert rctime.mktime(rctime.localtime(-1)) == -1
+
     def test_asctime(self):
         import time as rctime
         rctime.asctime()
@@ -138,18 +140,18 @@
         st_time = rctime.struct_time(tup)
         assert str(st_time).startswith('time.struct_time(tm_year=1, ')
         assert len(st_time) == len(tup)
-    
+
     def test_tzset(self):
         import time as rctime
         import os
-        
+
         if not os.name == "posix":
             skip("tzset available only under Unix")
-    
+
         # epoch time of midnight Dec 25th 2002. Never DST in northern
         # hemisphere.
         xmas2002 = 1040774400.0
-    
+
         # these formats are correct for 2002, and possibly future years
         # this format is the 'standard' as documented at:
         # http://www.opengroup.org/onlinepubs/007904975/basedefs/xbd_chap08.html
@@ -158,7 +160,7 @@
         eastern = 'EST+05EDT,M4.1.0,M10.5.0'
         victoria = 'AEST-10AEDT-11,M10.5.0,M3.5.0'
         utc = 'UTC+0'
-    
+
         org_TZ = os.environ.get('TZ', None)
         try:
             # Make sure we can switch to UTC time and results are correct
@@ -172,7 +174,7 @@
             assert rctime.daylight == 0
             assert rctime.timezone == 0
             assert rctime.localtime(xmas2002).tm_isdst == 0
-            
+
             # make sure we can switch to US/Eastern
             os.environ['TZ'] = eastern
             rctime.tzset()
@@ -183,7 +185,7 @@
             assert rctime.timezone == 18000
             assert rctime.altzone == 14400
             assert rctime.localtime(xmas2002).tm_isdst == 0
-            
+
             # now go to the southern hemisphere.
             os.environ['TZ'] = victoria
             rctime.tzset()
@@ -206,7 +208,7 @@
 
     def test_strftime(self):
         import time as rctime
-        
+
         t = rctime.time()
         tt = rctime.gmtime(t)
         for directive in ('a', 'A', 'b', 'B', 'c', 'd', 'H', 'I',
@@ -214,7 +216,7 @@
                           'U', 'w', 'W', 'x', 'X', 'y', 'Y', 'Z', '%'):
             format = ' %' + directive
             rctime.strftime(format, tt)
-        
+
         raises(TypeError, rctime.strftime, ())
         raises(TypeError, rctime.strftime, (1,))
         raises(TypeError, rctime.strftime, range(8))
@@ -234,10 +236,10 @@
 
     def test_strftime_bounds_checking(self):
         import time as rctime
-        
+
         # make sure that strftime() checks the bounds of the various parts
         # of the time tuple.
-    
+
         # check year
         raises(ValueError, rctime.strftime, '', (1899, 1, 1, 0, 0, 0, 0, 1, -1))
         if rctime.accept2dyear:


More information about the pypy-commit mailing list