[Python-checkins] cpython: Issue #21863: cProfile now displays the module name of C extension functions,

antoine.pitrou python-checkins at python.org
Sat Jun 28 05:55:57 CEST 2014


http://hg.python.org/cpython/rev/6dd4c2d30b0e
changeset:   91457:6dd4c2d30b0e
parent:      91455:ac270acff94f
user:        Antoine Pitrou <solipsis at pitrou.net>
date:        Fri Jun 27 23:49:29 2014 -0400
summary:
  Issue #21863: cProfile now displays the module name of C extension functions, in addition to their own name.

files:
  Lib/test/test_cprofile.py |  10 +++++-----
  Misc/NEWS                 |   3 +++
  Modules/_lsprof.c         |  11 +++++++++--
  3 files changed, 17 insertions(+), 7 deletions(-)


diff --git a/Lib/test/test_cprofile.py b/Lib/test/test_cprofile.py
--- a/Lib/test/test_cprofile.py
+++ b/Lib/test/test_cprofile.py
@@ -11,7 +11,7 @@
 class CProfileTest(ProfileTest):
     profilerclass = cProfile.Profile
     profilermodule = cProfile
-    expected_max_output = "{built-in method max}"
+    expected_max_output = "{built-in method builtins.max}"
 
     def get_expected_output(self):
         return _ProfileOutput
@@ -72,9 +72,9 @@
 profilee.py:88(helper2)                           <-       6    0.234    0.300  profilee.py:55(helper)
                                                            2    0.078    0.100  profilee.py:84(helper2_indirect)
 profilee.py:98(subhelper)                         <-       8    0.064    0.080  profilee.py:88(helper2)
-{built-in method exc_info}                        <-       4    0.000    0.000  profilee.py:73(helper1)
-{built-in method hasattr}                         <-       4    0.000    0.004  profilee.py:73(helper1)
+{built-in method builtins.hasattr}                <-       4    0.000    0.004  profilee.py:73(helper1)
                                                            8    0.000    0.008  profilee.py:88(helper2)
+{built-in method sys.exc_info}                    <-       4    0.000    0.000  profilee.py:73(helper1)
 {method 'append' of 'list' objects}               <-       4    0.000    0.000  profilee.py:73(helper1)"""
 _ProfileOutput['print_callees'] = """\
 <string>:1(<module>)                              ->       1    0.270    1.000  profilee.py:25(testfunc)
@@ -87,12 +87,12 @@
 profilee.py:55(helper)                            ->       4    0.116    0.120  profilee.py:73(helper1)
                                                            2    0.000    0.140  profilee.py:84(helper2_indirect)
                                                            6    0.234    0.300  profilee.py:88(helper2)
-profilee.py:73(helper1)                           ->       4    0.000    0.000  {built-in method exc_info}
+profilee.py:73(helper1)                           ->       4    0.000    0.004  {built-in method builtins.hasattr}
 profilee.py:84(helper2_indirect)                  ->       2    0.006    0.040  profilee.py:35(factorial)
                                                            2    0.078    0.100  profilee.py:88(helper2)
 profilee.py:88(helper2)                           ->       8    0.064    0.080  profilee.py:98(subhelper)
 profilee.py:98(subhelper)                         ->      16    0.016    0.016  profilee.py:110(__getattr__)
-{built-in method hasattr}                         ->      12    0.012    0.012  profilee.py:110(__getattr__)"""
+{built-in method builtins.hasattr}                ->      12    0.012    0.012  profilee.py:110(__getattr__)"""
 
 if __name__ == "__main__":
     main()
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -103,6 +103,9 @@
 Library
 -------
 
+- Issue #21863: cProfile now displays the module name of C extension functions,
+  in addition to their own name.
+
 - Issue #11453: asyncore: emit a ResourceWarning when an unclosed file_wrapper
   object is destroyed. The destructor now closes the file if needed. The
   close() method can now be called twice: the second call does nothing.
diff --git a/Modules/_lsprof.c b/Modules/_lsprof.c
--- a/Modules/_lsprof.c
+++ b/Modules/_lsprof.c
@@ -202,6 +202,8 @@
         */
         PyObject *self = fn->m_self;
         PyObject *name = PyUnicode_FromString(fn->m_ml->ml_name);
+        PyObject *modname = fn->m_module;
+
         if (name != NULL) {
             PyObject *mo = _PyType_Lookup(Py_TYPE(self), name);
             Py_XINCREF(mo);
@@ -213,9 +215,14 @@
                     return res;
             }
         }
+        /* Otherwise, use __module__ */
         PyErr_Clear();
-        return PyUnicode_FromFormat("<built-in method %s>",
-                                    fn->m_ml->ml_name);
+        if (modname != NULL && PyUnicode_Check(modname))
+            return PyUnicode_FromFormat("<built-in method %S.%s>",
+                                        modname,  fn->m_ml->ml_name);
+        else
+            return PyUnicode_FromFormat("<built-in method %s>",
+                                        fn->m_ml->ml_name);
     }
 }
 

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


More information about the Python-checkins mailing list