Merged revisions 73064-73065 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.
........
r73065 | antoine.pitrou | 2009-05-30 23:39:25 +0200 (sam., 30 mai 2009) | 3 lines
The test for #5330 wasn't correct.
........
diff --git a/Lib/test/test_cprofile.py b/Lib/test/test_cprofile.py
index 13c1060..831895c 100755
--- a/Lib/test/test_cprofile.py
+++ b/Lib/test/test_cprofile.py
@@ -9,6 +9,7 @@
class CProfileTest(ProfileTest):
profilerclass = cProfile.Profile
+ expected_list_sort_output = "{method 'sort' of 'list' objects}"
# Issue 3895.
def test_bad_counter_during_dealloc(self):
diff --git a/Lib/test/test_profile.py b/Lib/test/test_profile.py
index 0bd2530..0016d51 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_output = {}
+ expected_list_sort_output = ':0(sort)'
@classmethod
def do_profiling(cls):
@@ -40,6 +41,25 @@
"Stats.%s output for %s doesn't fit expectation!" %
(method, self.profilerclass.__name__))
+ 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 = [
+ "[].sort()",
+ "[].sort(reverse=True)",
+ "[].sort(*(None, None, True))",
+ "[].sort(**dict(reverse=True))",
+ ]
+ 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_list_sort_output in res,
+ "Profiling {0!r} didn't report list.sort:\n{1}".format(stmt, res))
+
def regenerate_expected_output(filename, cls):
filename = filename.rstrip('co')
diff --git a/Misc/NEWS b/Misc/NEWS
index 79d7f0e..6dcf1d8 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,9 @@
Core and Builtins
-----------------
+- Issue #5330: C functions called with keyword arguments were not reported by
+ the various profiling modules (profile, cProfile). Patch by Hagen F�rstenau.
+
- Issue #6089: str.format can raise SystemError with certain invalid
field specifiers.
diff --git a/Python/ceval.c b/Python/ceval.c
index bd35185..db454d5 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -3911,10 +3911,17 @@
PCALL(PCALL_METHOD);
else if (PyType_Check(func))
PCALL(PCALL_TYPE);
+ else if (PyCFunction_Check(func))
+ PCALL(PCALL_CFUNCTION);
else
PCALL(PCALL_OTHER);
#endif
- result = PyObject_Call(func, callargs, kwdict);
+ if (PyCFunction_Check(func)) {
+ PyThreadState *tstate = PyThreadState_GET();
+ C_TRACE(result, PyCFunction_Call(func, callargs, kwdict));
+ }
+ else
+ result = PyObject_Call(func, callargs, kwdict);
call_fail:
Py_XDECREF(callargs);
Py_XDECREF(kwdict);
@@ -3999,10 +4006,17 @@
PCALL(PCALL_METHOD);
else if (PyType_Check(func))
PCALL(PCALL_TYPE);
+ else if (PyCFunction_Check(func))
+ PCALL(PCALL_CFUNCTION);
else
PCALL(PCALL_OTHER);
#endif
- result = PyObject_Call(func, callargs, kwdict);
+ if (PyCFunction_Check(func)) {
+ PyThreadState *tstate = PyThreadState_GET();
+ C_TRACE(result, PyCFunction_Call(func, callargs, kwdict));
+ }
+ else
+ result = PyObject_Call(func, callargs, kwdict);
ext_call_fail:
Py_XDECREF(callargs);
Py_XDECREF(kwdict);