mirror of
https://github.com/python/cpython.git
synced 2024-11-24 17:47:13 +01:00
gh-125422: Don't set the caller's f_trace if it's botframe (#125427)
This commit is contained in:
parent
d3c82b9cce
commit
703227dd02
@ -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
|
||||
|
@ -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):
|
||||
|
@ -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
|
||||
|
@ -0,0 +1 @@
|
||||
Fixed the bug where :mod:`pdb` and :mod:`bdb` can step into the bottom caller frame.
|
Loading…
Reference in New Issue
Block a user