]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-46600: Fix test_gdb.test_pycfunction() for clang -Og (GH-31058)
authorVictor Stinner <vstinner@python.org>
Tue, 1 Feb 2022 17:12:26 +0000 (18:12 +0100)
committerGitHub <noreply@github.com>
Tue, 1 Feb 2022 17:12:26 +0000 (18:12 +0100)
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.

Lib/test/test_gdb.py
Misc/NEWS.d/next/Tests/2022-02-01-17-13-53.bpo-46600.FMCk8Z.rst [new file with mode: 0644]

index eaeb6fb8ff56876fb7461a8881ac33cc81b07985..344fd3dd3f7fc2a841170c61625bd84448256860 100644 (file)
@@ -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")
diff --git a/Misc/NEWS.d/next/Tests/2022-02-01-17-13-53.bpo-46600.FMCk8Z.rst b/Misc/NEWS.d/next/Tests/2022-02-01-17-13-53.bpo-46600.FMCk8Z.rst
new file mode 100644 (file)
index 0000000..0ae1d4d
--- /dev/null
@@ -0,0 +1,2 @@
+Fix test_gdb.test_pycfunction() for Python built with ``clang -Og``.
+Tolerate inlined functions in the gdb traceback. Patch by Victor Stinner.