[Python-checkins] cpython (merge default -> default): merge heads

benjamin.peterson python-checkins at python.org
Tue Apr 3 06:35:55 CEST 2012


http://hg.python.org/cpython/rev/05cfde25ded1
changeset:   76086:05cfde25ded1
parent:      76085:ff7587546a1d
parent:      76082:d0e4e3ef224e
user:        Benjamin Peterson <benjamin at python.org>
date:        Tue Apr 03 00:35:44 2012 -0400
summary:
  merge heads

files:
  Doc/library/time.rst                        |  16 ++++
  Lib/importlib/_bootstrap.py                 |   3 +
  Lib/importlib/test/import_/test_packages.py |  13 +++
  Lib/test/test_time.py                       |  11 +++
  Modules/_decimal/_decimal.c                 |  10 +-
  Modules/timemodule.c                        |  33 ++++++++++
  6 files changed, 81 insertions(+), 5 deletions(-)


diff --git a/Doc/library/time.rst b/Doc/library/time.rst
--- a/Doc/library/time.rst
+++ b/Doc/library/time.rst
@@ -151,6 +151,13 @@
    .. versionadded:: 3.3
 
 
+.. function:: clock_settime(clk_id, time)
+
+   Set the time of the specified clock *clk_id*.
+
+   .. versionadded:: 3.3
+
+
 .. data:: CLOCK_REALTIME
 
    System-wide real-time clock. Setting this clock requires appropriate
@@ -159,6 +166,15 @@
    .. versionadded:: 3.3
 
 
+.. data:: CLOCK_HIGHRES
+
+   The Solaris OS has a CLOCK_HIGHRES timer that attempts to use an optimal
+   hardware source, and may give close to nanosecond resolution. CLOCK_HIGHRES
+   is the nonadjustable, high-resolution clock.
+
+   .. versionadded:: 3.3
+
+
 .. data:: CLOCK_MONOTONIC
 
    Clock that cannot be set and represents monotonic time since some
diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py
--- a/Lib/importlib/_bootstrap.py
+++ b/Lib/importlib/_bootstrap.py
@@ -927,6 +927,9 @@
     if parent:
         if parent not in sys.modules:
             import_(parent)
+        # Crazy side-effects!
+        if name in sys.modules:
+            return sys.modules[name]
         # Backwards-compatibility; be nicer to skip the dict lookup.
         parent_module = sys.modules[parent]
         try:
diff --git a/Lib/importlib/test/import_/test_packages.py b/Lib/importlib/test/import_/test_packages.py
--- a/Lib/importlib/test/import_/test_packages.py
+++ b/Lib/importlib/test/import_/test_packages.py
@@ -27,6 +27,19 @@
         with self.assertRaises(ImportError):
             import_util.import_('sys.no_submodules_here')
 
+    def test_module_not_package_but_side_effects(self):
+        # If a module injects something into sys.modules as a side-effect, then
+        # pick up on that fact.
+        name = 'mod'
+        subname = name + '.b'
+        def module_injection():
+            sys.modules[subname] = 'total bunk'
+        mock_modules = util.mock_modules('mod',
+                                         module_code={'mod': module_injection})
+        with mock_modules as mock:
+            with util.import_state(meta_path=[mock]):
+                submodule = import_util.import_(subname)
+
 
 def test_main():
     from test.support import run_unittest
diff --git a/Lib/test/test_time.py b/Lib/test/test_time.py
--- a/Lib/test/test_time.py
+++ b/Lib/test/test_time.py
@@ -47,6 +47,17 @@
         self.assertGreater(res, 0.0)
         self.assertLessEqual(res, 1.0)
 
+    @unittest.skipUnless(hasattr(time, 'clock_settime'),
+                         'need time.clock_settime()')
+    def test_clock_settime(self):
+        t = time.clock_gettime(time.CLOCK_REALTIME)
+        try:
+            time.clock_settime(time.CLOCK_REALTIME, t)
+        except PermissionError:
+            pass
+
+        self.assertRaises(OSError, time.clock_settime, time.CLOCK_MONOTONIC, 0)
+
     def test_conversions(self):
         self.assertEqual(time.ctime(self.t),
                          time.asctime(time.localtime(self.t)))
diff --git a/Modules/_decimal/_decimal.c b/Modules/_decimal/_decimal.c
--- a/Modules/_decimal/_decimal.c
+++ b/Modules/_decimal/_decimal.c
@@ -1510,7 +1510,7 @@
 #define CURRENT_CONTEXT_ADDR(ctx) \
     ctx = CTX(current_context())
 
-/* Return current context, increment reference */
+/* Return a new reference to the current context */
 static PyObject *
 PyDec_GetCurrentContext(void)
 {
@@ -1614,7 +1614,7 @@
     ctx = CTX(_c_t_x_o_b_j);                    \
 }
 
-/* Return current context, increment reference */
+/* Return a new reference to the current context */
 static PyObject *
 PyDec_GetCurrentContext(void)
 {
@@ -1759,7 +1759,7 @@
     0,                                      /* tp_print */
     (getattrfunc) 0,                        /* tp_getattr */
     (setattrfunc) 0,                        /* tp_setattr */
-    0,                                      /* tp_compare */
+    0,                                      /* tp_reserved */
     (reprfunc) 0,                           /* tp_repr */
     0,                                      /* tp_as_number */
     0,                                      /* tp_as_sequence */
@@ -2699,7 +2699,7 @@
 
 
 /******************************************************************************/
-/*                        Implicit conversions to Decimal                     */ 
+/*                        Implicit conversions to Decimal                     */
 /******************************************************************************/
 
 /* Try to convert PyObject v to a new PyDecObject conv. If the conversion
@@ -2796,7 +2796,7 @@
 
 
 /******************************************************************************/
-/*              Implicit conversions to Decimal for comparison                */ 
+/*              Implicit conversions to Decimal for comparison                */
 /******************************************************************************/
 
 /* Convert rationals for comparison */
diff --git a/Modules/timemodule.c b/Modules/timemodule.c
--- a/Modules/timemodule.c
+++ b/Modules/timemodule.c
@@ -158,6 +158,33 @@
 "clock_gettime(clk_id) -> floating point number\n\
 \n\
 Return the time of the specified clock clk_id.");
+
+static PyObject *
+time_clock_settime(PyObject *self, PyObject *args)
+{
+    clockid_t clk_id;
+    PyObject *obj;
+    struct timespec tp;
+    int ret;
+
+    if (!PyArg_ParseTuple(args, "iO:clock_settime", &clk_id, &obj))
+        return NULL;
+
+    if (_PyTime_ObjectToTimespec(obj, &tp.tv_sec, &tp.tv_nsec) == -1)
+        return NULL;
+
+    ret = clock_settime((clockid_t)clk_id, &tp);
+    if (ret != 0) {
+        PyErr_SetFromErrno(PyExc_IOError);
+        return NULL;
+    }
+    Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(clock_settime_doc,
+"clock_settime(clk_id, time)\n\
+\n\
+Set the time of the specified clock clk_id.");
 #endif
 
 #ifdef HAVE_CLOCK_GETRES
@@ -962,6 +989,9 @@
 #ifdef CLOCK_MONOTONIC_RAW
     PyModule_AddIntMacro(m, CLOCK_MONOTONIC_RAW);
 #endif
+#ifdef CLOCK_HIGHRES
+    PyModule_AddIntMacro(m, CLOCK_HIGHRES);
+#endif
 #ifdef CLOCK_PROCESS_CPUTIME_ID
     PyModule_AddIntMacro(m, CLOCK_PROCESS_CPUTIME_ID);
 #endif
@@ -980,6 +1010,9 @@
 #ifdef HAVE_CLOCK_GETTIME
     {"clock_gettime",   time_clock_gettime, METH_VARARGS, clock_gettime_doc},
 #endif
+#ifdef HAVE_CLOCK_GETTIME
+    {"clock_settime",   time_clock_settime, METH_VARARGS, clock_settime_doc},
+#endif
 #ifdef HAVE_CLOCK_GETRES
     {"clock_getres",    time_clock_getres, METH_VARARGS, clock_getres_doc},
 #endif

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list