diff options
author | Brett Cannon <brett@python.org> | 2012-01-27 00:09:44 (GMT) |
---|---|---|
committer | Brett Cannon <brett@python.org> | 2012-01-27 00:09:44 (GMT) |
commit | c9f71481d407d08a3c51888f3bfe8575964be7ab (patch) | |
tree | 3889e342a292429b8f7c1b7267f817c80d5170fe | |
parent | 51d14f8e565cd82a4efb6c18b7fdf29eddcca878 (diff) | |
parent | 53d3645f959b95ee1ef2cd7f999ff0cfbce98197 (diff) | |
download | cpython-c9f71481d407d08a3c51888f3bfe8575964be7ab.zip cpython-c9f71481d407d08a3c51888f3bfe8575964be7ab.tar.gz cpython-c9f71481d407d08a3c51888f3bfe8575964be7ab.tar.bz2 |
Merge
-rw-r--r-- | Lib/test/test_time.py | 27 | ||||
-rw-r--r-- | Misc/NEWS | 3 | ||||
-rw-r--r-- | Modules/timemodule.c | 38 |
3 files changed, 45 insertions, 23 deletions
diff --git a/Lib/test/test_time.py b/Lib/test/test_time.py index 0533895..e3298d5 100644 --- a/Lib/test/test_time.py +++ b/Lib/test/test_time.py @@ -309,7 +309,7 @@ class TimeTestCase(unittest.TestCase): for t in (-2, -1, 0, 1): try: tt = time.localtime(t) - except (OverflowError, ValueError): + except (OverflowError, OSError): pass else: self.assertEqual(time.mktime(tt), t) @@ -345,16 +345,21 @@ class TimeTestCase(unittest.TestCase): def test_localtime_failure(self): # Issue #13847: check for localtime() failure - invalid_time_t = 2**60 - try: - time.localtime(invalid_time_t) - except ValueError as err: - if str(err) == "timestamp out of range for platform time_t": - self.skipTest("need 64-bit time_t") - else: - raise - except OSError: - pass + invalid_time_t = None + for time_t in (-1, 2**30, 2**33, 2**60): + try: + time.localtime(time_t) + except ValueError as err: + if str(err) == "timestamp out of range for platform time_t": + self.skipTest("need 64-bit time_t") + else: + raise + except OSError: + 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.gmtime, invalid_time_t) self.assertRaises(OSError, time.ctime, invalid_time_t) @@ -463,7 +463,8 @@ Library - Issue #13847: time.localtime() and time.gmtime() now raise an OSError instead 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 minor versions not matching. diff --git a/Modules/timemodule.c b/Modules/timemodule.c index d2cc62f..30a01f5 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -62,6 +62,31 @@ PyDoc_STRVAR(time_doc, Return the current time in seconds since the Epoch.\n\ 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__) /* Win32 has better clock replacement; we have our own version, due to Mark Hammond and Tim Peters */ @@ -79,8 +104,7 @@ time_clock(PyObject *self, PyObject *unused) if (!QueryPerformanceFrequency(&freq) || freq.QuadPart == 0) { /* Unlikely to happen - this works on all intel machines at least! Revert to clock() */ - return PyFloat_FromDouble(((double)clock()) / - CLOCKS_PER_SEC); + return pyclock(); } divisor = (double)freq.QuadPart; } @@ -91,18 +115,10 @@ time_clock(PyObject *self, PyObject *unused) #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 * time_clock(PyObject *self, PyObject *unused) { - return PyFloat_FromDouble(((double)clock()) / CLOCKS_PER_SEC); + return pyclock(); } #endif /* HAVE_CLOCK */ |