Author: Alex Gaynor <alex.gay...@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: _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit