This commit is contained in:
Brett Cannon 2012-01-26 19:09:44 -05:00
commit c9f71481d4
3 changed files with 45 additions and 23 deletions

View file

@ -309,7 +309,7 @@ class TimeTestCase(unittest.TestCase):
for t in (-2, -1, 0, 1): for t in (-2, -1, 0, 1):
try: try:
tt = time.localtime(t) tt = time.localtime(t)
except (OverflowError, ValueError): except (OverflowError, OSError):
pass pass
else: else:
self.assertEqual(time.mktime(tt), t) self.assertEqual(time.mktime(tt), t)
@ -345,16 +345,21 @@ class TimeTestCase(unittest.TestCase):
def test_localtime_failure(self): def test_localtime_failure(self):
# Issue #13847: check for localtime() failure # Issue #13847: check for localtime() failure
invalid_time_t = 2**60 invalid_time_t = None
for time_t in (-1, 2**30, 2**33, 2**60):
try: try:
time.localtime(invalid_time_t) time.localtime(time_t)
except ValueError as err: except ValueError as err:
if str(err) == "timestamp out of range for platform time_t": if str(err) == "timestamp out of range for platform time_t":
self.skipTest("need 64-bit time_t") self.skipTest("need 64-bit time_t")
else: else:
raise raise
except OSError: except OSError:
pass invalid_time_t = time_t
break
if invalid_time_t is None:
self.skipTest("unable to find an invalid time_t value")
self.assertRaises(OSError, time.localtime, invalid_time_t) self.assertRaises(OSError, time.localtime, invalid_time_t)
self.assertRaises(OSError, time.gmtime, invalid_time_t) self.assertRaises(OSError, time.gmtime, invalid_time_t)
self.assertRaises(OSError, time.ctime, invalid_time_t) self.assertRaises(OSError, time.ctime, invalid_time_t)

View file

@ -463,7 +463,8 @@ Library
- Issue #13847: time.localtime() and time.gmtime() now raise an OSError instead - Issue #13847: time.localtime() and time.gmtime() now raise an OSError instead
of ValueError on failure. time.ctime() and time.asctime() now raises an of ValueError on failure. time.ctime() and time.asctime() now raises an
OSError if localtime() failed. OSError if localtime() failed. time.clock() now raises a RuntimeError if the
processor time used is not available or its value cannot be represented
- Issue #13862: Fix spurious failure in test_zlib due to runtime/compile time - Issue #13862: Fix spurious failure in test_zlib due to runtime/compile time
minor versions not matching. minor versions not matching.

View file

@ -62,6 +62,31 @@ PyDoc_STRVAR(time_doc,
Return the current time in seconds since the Epoch.\n\ Return the current time in seconds since the Epoch.\n\
Fractions of a second may be present if the system clock provides them."); Fractions of a second may be present if the system clock provides them.");
#if defined(HAVE_CLOCK)
#ifndef CLOCKS_PER_SEC
#ifdef CLK_TCK
#define CLOCKS_PER_SEC CLK_TCK
#else
#define CLOCKS_PER_SEC 1000000
#endif
#endif
static PyObject *
pyclock(void)
{
clock_t value;
value = clock();
if (value == (clock_t)-1) {
PyErr_SetString(PyExc_RuntimeError,
"the processor time used is not available "
"or its value cannot be represented");
return NULL;
}
return PyFloat_FromDouble((double)value / CLOCKS_PER_SEC);
}
#endif /* HAVE_CLOCK */
#if defined(MS_WINDOWS) && !defined(__BORLANDC__) #if defined(MS_WINDOWS) && !defined(__BORLANDC__)
/* Win32 has better clock replacement; we have our own version, due to Mark /* Win32 has better clock replacement; we have our own version, due to Mark
Hammond and Tim Peters */ Hammond and Tim Peters */
@ -79,8 +104,7 @@ time_clock(PyObject *self, PyObject *unused)
if (!QueryPerformanceFrequency(&freq) || freq.QuadPart == 0) { if (!QueryPerformanceFrequency(&freq) || freq.QuadPart == 0) {
/* Unlikely to happen - this works on all intel /* Unlikely to happen - this works on all intel
machines at least! Revert to clock() */ machines at least! Revert to clock() */
return PyFloat_FromDouble(((double)clock()) / return pyclock();
CLOCKS_PER_SEC);
} }
divisor = (double)freq.QuadPart; divisor = (double)freq.QuadPart;
} }
@ -91,18 +115,10 @@ time_clock(PyObject *self, PyObject *unused)
#elif defined(HAVE_CLOCK) #elif defined(HAVE_CLOCK)
#ifndef CLOCKS_PER_SEC
#ifdef CLK_TCK
#define CLOCKS_PER_SEC CLK_TCK
#else
#define CLOCKS_PER_SEC 1000000
#endif
#endif
static PyObject * static PyObject *
time_clock(PyObject *self, PyObject *unused) time_clock(PyObject *self, PyObject *unused)
{ {
return PyFloat_FromDouble(((double)clock()) / CLOCKS_PER_SEC); return pyclock();
} }
#endif /* HAVE_CLOCK */ #endif /* HAVE_CLOCK */