]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-125422: Don't set the caller's f_trace if it's botframe (#125427)
authorTian Gao <gaogaotiantian@hotmail.com>
Tue, 15 Oct 2024 14:51:37 +0000 (07:51 -0700)
committerGitHub <noreply@github.com>
Tue, 15 Oct 2024 14:51:37 +0000 (10:51 -0400)
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 666f9714eb9b7a2e2f4e4bc00c75f293181c3959..9755d61dd2696c162ab0c6c38dc93418564410d5 100644 (file)
@@ -350,9 +350,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 10c58c04dfd25e98a95b1113925ca7e87250312a..f15dae13eb384ef355bedb78d90402ac30deb78f 100644 (file)
@@ -1217,6 +1217,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 46eb00261042bc5b32b407ccbd35d77edce78550..3dc65fdfc0340950b0f26cea08f9d29e8e25b0c6 100644 (file)
@@ -3393,6 +3393,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.