]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.13] gh-125422: Don't set the caller's f_trace if it's botframe (GH-125427) (#125530)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Tue, 15 Oct 2024 15:26:46 +0000 (17:26 +0200)
committerGitHub <noreply@github.com>
Tue, 15 Oct 2024 15:26:46 +0000 (15:26 +0000)
gh-125422: Don't set the caller's f_trace if it's botframe (GH-125427)
(cherry picked from commit 703227dd021491ceb9343f69fa48f4b6a05adbb3)

Co-authored-by: Tian Gao <gaogaotiantian@hotmail.com>
Lib/bdb.py
Lib/test/test_bdb.py
Lib/test/test_pdb.py
Misc/NEWS.d/next/Library/2024-10-14-04-44-12.gh-issue-125422.MlVuC6.rst [new file with mode: 0644]

index aa621053cfb4bcfaffc4f6321ca331992ecc1cb3..a0e46e7f413816a383d3271ed2ba591ad6c29951 100644 (file)
@@ -329,9 +329,10 @@ class Bdb:
         # Issue #13183: pdb skips frames after hitting a breakpoint and running
         # step commands.
         # Restore the trace function in the caller (that may not have been set
-        # for performance reasons) when returning from the current frame.
+        # for performance reasons) when returning from the current frame, unless
+        # the caller is the botframe.
         caller_frame = current_frame.f_back
-        if caller_frame and not caller_frame.f_trace:
+        if caller_frame and not caller_frame.f_trace and caller_frame is not self.botframe:
             caller_frame.f_trace = self.trace_dispatch
 
     # Derived classes and clients can call the following methods
index ed1a63daea11869c8fe3043187e7db1cf6f7c122..2e20c08a672d575d4e410f38815fcceb46f01f9d 100644 (file)
@@ -1216,6 +1216,19 @@ class IssuesTestCase(BaseTestCase):
             with TracerRun(self) as tracer:
                 tracer.runcall(tfunc_import)
 
+    def test_next_to_botframe(self):
+        # gh-125422
+        # Check that next command won't go to the bottom frame.
+        code = """
+            lno = 2
+        """
+        self.expect_set = [
+            ('line', 2, '<module>'),   ('step', ),
+            ('return', 2, '<module>'), ('next', ),
+        ]
+        with TracerRun(self) as tracer:
+            tracer.run(compile(textwrap.dedent(code), '<string>', 'exec'))
+
 
 class TestRegressions(unittest.TestCase):
     def test_format_stack_entry_no_lineno(self):
index 9b2c885ed67f85c25b6ad486d4db2ed0a2e9d466..35285b7706bb70b7547bb94367ac3e31a6326dbf 100644 (file)
@@ -3181,6 +3181,20 @@ def bœr():
         self.assertRegex(res, "Restarting .* with arguments:\na b c")
         self.assertRegex(res, "Restarting .* with arguments:\nd e f")
 
+    def test_step_into_botframe(self):
+        # gh-125422
+        # pdb should not be able to step into the botframe (bdb.py)
+        script = "x = 1"
+        commands = """
+            step
+            step
+            step
+            quit
+        """
+        stdout, _ = self.run_pdb_script(script, commands)
+        self.assertIn("The program finished", stdout)
+        self.assertNotIn("bdb.py", stdout)
+
     def test_pdbrc_basic(self):
         script = textwrap.dedent("""
             a = 1
diff --git a/Misc/NEWS.d/next/Library/2024-10-14-04-44-12.gh-issue-125422.MlVuC6.rst b/Misc/NEWS.d/next/Library/2024-10-14-04-44-12.gh-issue-125422.MlVuC6.rst
new file mode 100644 (file)
index 0000000..c890ece
--- /dev/null
@@ -0,0 +1 @@
+Fixed the bug where :mod:`pdb` and :mod:`bdb` can step into the bottom caller frame.