summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrett Cannon <brett@python.org>2012-01-27 00:09:44 (GMT)
committerBrett Cannon <brett@python.org>2012-01-27 00:09:44 (GMT)
commitc9f71481d407d08a3c51888f3bfe8575964be7ab (patch)
tree3889e342a292429b8f7c1b7267f817c80d5170fe
parent51d14f8e565cd82a4efb6c18b7fdf29eddcca878 (diff)
parent53d3645f959b95ee1ef2cd7f999ff0cfbce98197 (diff)
downloadcpython-c9f71481d407d08a3c51888f3bfe8575964be7ab.zip
cpython-c9f71481d407d08a3c51888f3bfe8575964be7ab.tar.gz
cpython-c9f71481d407d08a3c51888f3bfe8575964be7ab.tar.bz2
Merge
-rw-r--r--Lib/test/test_time.py27
-rw-r--r--Misc/NEWS3
-rw-r--r--Modules/timemodule.c38
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)
diff --git a/Misc/NEWS b/Misc/NEWS
index 8285f35..45ded06 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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 */