mirror of https://github.com/python/cpython
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:
parent
7e9d75a91d
commit
6987d54116
|
@ -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):
|
||||||
|
|
|
@ -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')
|
||||||
|
|
|
@ -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.
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue