Merged revisions 73064 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r73064 | antoine.pitrou | 2009-05-30 23:27:00 +0200 (sam., 30 mai 2009) | 4 lines

  Issue #5330: C functions called with keyword arguments were not reported by
  the various profiling modules (profile, cProfile). Patch by Hagen Fürstenau.
........
diff --git a/Lib/test/test_profile.py b/Lib/test/test_profile.py
index c972fc6..243a322 100755
--- a/Lib/test/test_profile.py
+++ b/Lib/test/test_profile.py
@@ -16,6 +16,7 @@
 
     profilerclass = profile.Profile
     methodnames = ['print_stats', 'print_callers', 'print_callees']
+    expected_max_output = ':0(max)'
 
     def get_expected_output(self):
         return _ProfileOutput
@@ -53,6 +54,27 @@
                                   results[i+1].split('\n'),
                                   expected[method].split('\n'))))
 
+    def test_calling_conventions(self):
+        # Issue #5330: profile and cProfile wouldn't report C functions called
+        # with keyword arguments. We test all calling conventions.
+        stmts = [
+            "max([0])",
+            "max([0], key=int)",
+            "max([0], **dict(key=int))",
+            "max(*([0],))",
+            "max(*([0],), key=int)",
+            "max(*([0],), **dict(key=int))",
+        ]
+        for stmt in stmts:
+            s = StringIO()
+            prof = self.profilerclass(timer, 0.001)
+            prof.runctx(stmt, globals(), locals())
+            stats = pstats.Stats(prof, stream=s)
+            stats.print_stats()
+            res = s.getvalue()
+            self.assertTrue(self.expected_max_output in res,
+                "Profiling {0!r} didn't report max:\n{1}".format(stmt, res))
+
 
 def regenerate_expected_output(filename, cls):
     filename = filename.rstrip('co')