[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