diff options
author | Victor Stinner <vstinner@python.org> | 2022-02-01 17:12:26 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-02-01 17:12:26 (GMT) |
commit | bebaa95fd0f44babf8b6bcffd8f2908c73ca259e (patch) | |
tree | 8a79ca78d827d5153f8bee5c197fc5d0c147b502 /Lib | |
parent | f78be59c83c151d94902daef56218530c52e29e7 (diff) | |
download | cpython-bebaa95fd0f44babf8b6bcffd8f2908c73ca259e.zip cpython-bebaa95fd0f44babf8b6bcffd8f2908c73ca259e.tar.gz cpython-bebaa95fd0f44babf8b6bcffd8f2908c73ca259e.tar.bz2 |
bpo-46600: Fix test_gdb.test_pycfunction() for clang -Og (GH-31058)
Fix test_gdb.test_pycfunction() for Python built with clang -Og.
Tolerate inlined functions in the gdb traceback.
When _testcapimodule.c is built by clang -Og, _null_to_none() is
inlined in meth_varargs() and so gdb returns _null_to_none() as
the frame #1. If it's not inlined, meth_varargs() is the frame #1.
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/test/test_gdb.py | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/Lib/test/test_gdb.py b/Lib/test/test_gdb.py index eaeb6fb..344fd3d 100644 --- a/Lib/test/test_gdb.py +++ b/Lib/test/test_gdb.py @@ -897,15 +897,19 @@ id(42) # to suppress these. See also the comment in DebuggerTests.get_stack_trace def test_pycfunction(self): 'Verify that "py-bt" displays invocations of PyCFunction instances' + # bpo-46600: If the compiler inlines _null_to_none() in meth_varargs() + # (ex: clang -Og), _null_to_none() is the frame #1. Otherwise, + # meth_varargs() is the frame #1. + expected_frame = r'#(1|2)' # Various optimizations multiply the code paths by which these are # called, so test a variety of calling conventions. - for func_name, args, expected_frame in ( - ('meth_varargs', '', 1), - ('meth_varargs_keywords', '', 1), - ('meth_o', '[]', 1), - ('meth_noargs', '', 1), - ('meth_fastcall', '', 1), - ('meth_fastcall_keywords', '', 1), + for func_name, args in ( + ('meth_varargs', ''), + ('meth_varargs_keywords', ''), + ('meth_o', '[]'), + ('meth_noargs', ''), + ('meth_fastcall', ''), + ('meth_fastcall_keywords', ''), ): for obj in ( '_testcapi', @@ -945,10 +949,9 @@ id(42) # defined.' message in stderr. ignore_stderr=True, ) - self.assertIn( - f'#{expected_frame} <built-in method {func_name}', - gdb_output, - ) + regex = expected_frame + regex += re.escape(f' <built-in method {func_name}') + self.assertRegex(gdb_output, regex) @unittest.skipIf(python_is_optimized(), "Python was compiled with optimizations") |