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.
........
This commit is contained in:
Antoine Pitrou 2009-05-30 21:43:48 +00:00
parent 7e9d75a91d
commit 6987d54116
4 changed files with 40 additions and 2 deletions

View File

@ -9,6 +9,7 @@ from test.test_profile import ProfileTest, regenerate_expected_output
class CProfileTest(ProfileTest): class CProfileTest(ProfileTest):
profilerclass = cProfile.Profile profilerclass = cProfile.Profile
expected_list_sort_output = "{method 'sort' of 'list' objects}"
# Issue 3895. # Issue 3895.
def test_bad_counter_during_dealloc(self): def test_bad_counter_during_dealloc(self):

View File

@ -16,6 +16,7 @@ class ProfileTest(unittest.TestCase):
profilerclass = profile.Profile profilerclass = profile.Profile
methodnames = ['print_stats', 'print_callers', 'print_callees'] methodnames = ['print_stats', 'print_callers', 'print_callees']
expected_output = {} expected_output = {}
expected_list_sort_output = ':0(sort)'
@classmethod @classmethod
def do_profiling(cls): def do_profiling(cls):
@ -40,6 +41,25 @@ class ProfileTest(unittest.TestCase):
"Stats.%s output for %s doesn't fit expectation!" % "Stats.%s output for %s doesn't fit expectation!" %
(method, self.profilerclass.__name__)) (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): def regenerate_expected_output(filename, cls):
filename = filename.rstrip('co') filename = filename.rstrip('co')

View File

@ -12,6 +12,9 @@ What's New in Python 2.6.3
Core and Builtins 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 - Issue #6089: str.format can raise SystemError with certain invalid
field specifiers. field specifiers.

View File

@ -3911,9 +3911,16 @@ do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
PCALL(PCALL_METHOD); PCALL(PCALL_METHOD);
else if (PyType_Check(func)) else if (PyType_Check(func))
PCALL(PCALL_TYPE); PCALL(PCALL_TYPE);
else if (PyCFunction_Check(func))
PCALL(PCALL_CFUNCTION);
else else
PCALL(PCALL_OTHER); PCALL(PCALL_OTHER);
#endif #endif
if (PyCFunction_Check(func)) {
PyThreadState *tstate = PyThreadState_GET();
C_TRACE(result, PyCFunction_Call(func, callargs, kwdict));
}
else
result = PyObject_Call(func, callargs, kwdict); result = PyObject_Call(func, callargs, kwdict);
call_fail: call_fail:
Py_XDECREF(callargs); Py_XDECREF(callargs);
@ -3999,9 +4006,16 @@ ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
PCALL(PCALL_METHOD); PCALL(PCALL_METHOD);
else if (PyType_Check(func)) else if (PyType_Check(func))
PCALL(PCALL_TYPE); PCALL(PCALL_TYPE);
else if (PyCFunction_Check(func))
PCALL(PCALL_CFUNCTION);
else else
PCALL(PCALL_OTHER); PCALL(PCALL_OTHER);
#endif #endif
if (PyCFunction_Check(func)) {
PyThreadState *tstate = PyThreadState_GET();
C_TRACE(result, PyCFunction_Call(func, callargs, kwdict));
}
else
result = PyObject_Call(func, callargs, kwdict); result = PyObject_Call(func, callargs, kwdict);
ext_call_fail: ext_call_fail:
Py_XDECREF(callargs); Py_XDECREF(callargs);