https://github.com/python/cpython/commit/31ce5c05a489fa22f30c4afdec162e4e669af15a
commit: 31ce5c05a489fa22f30c4afdec162e4e669af15a
branch: main
author: Tian Gao <[email protected]>
committer: gaogaotiantian <[email protected]>
date: 2024-06-20T10:38:07-07:00
summary:

gh-120769: Add pdb meta command to print frame status. (#120770)

files:
A Misc/NEWS.d/next/Library/2024-06-20-01-31-24.gh-issue-120769.PfiMrc.rst
M Lib/pdb.py
M Lib/test/test_pdb.py

diff --git a/Lib/pdb.py b/Lib/pdb.py
index b1be207a9fa98a..4af16d0a087c8c 100644
--- a/Lib/pdb.py
+++ b/Lib/pdb.py
@@ -517,7 +517,7 @@ def _validate_file_mtime(self):
 
     # Called before loop, handles display expressions
     # Set up convenience variable containers
-    def preloop(self):
+    def _show_display(self):
         displaying = self.displaying.get(self.curframe)
         if displaying:
             for expr, oldvalue in displaying.items():
@@ -605,15 +605,13 @@ def interaction(self, frame, tb_or_exc):
             self.setup(frame, tb)
             # We should print the stack entry if and only if the user input
             # is expected, and we should print it right before the user input.
-            # If self.cmdqueue is not empty, we append a "w 0" command to the
-            # queue, which is equivalent to print_stack_entry
-            if self.cmdqueue:
-                self.cmdqueue.append('w 0')
-            else:
-                self.print_stack_entry(self.stack[self.curindex])
+            # We achieve this by appending _pdbcmd_print_frame_status to the
+            # command queue. If cmdqueue is not exausted, the user input is
+            # not expected and we will not print the stack entry.
+            self.cmdqueue.append('_pdbcmd_print_frame_status')
             self._cmdloop()
-            # If "w 0" is not used, pop it out
-            if self.cmdqueue and self.cmdqueue[-1] == 'w 0':
+            # If _pdbcmd_print_frame_status is not used, pop it out
+            if self.cmdqueue and self.cmdqueue[-1] == 
'_pdbcmd_print_frame_status':
                 self.cmdqueue.pop()
             self.forget()
 
@@ -846,6 +844,10 @@ def onecmd(self, line):
         """
         if not self.commands_defining:
             self._validate_file_mtime()
+            if line.startswith('_pdbcmd'):
+                command, arg, line = self.parseline(line)
+                if hasattr(self, command):
+                    return getattr(self, command)(arg)
             return cmd.Cmd.onecmd(self, line)
         else:
             return self.handle_command_def(line)
@@ -982,6 +984,12 @@ def completedefault(self, text, line, begidx, endidx):
             state += 1
         return matches
 
+    # Pdb meta commands, only intended to be used internally by pdb
+
+    def _pdbcmd_print_frame_status(self, arg):
+        self.print_stack_trace(0)
+        self._show_display()
+
     # Command definitions, called by cmdloop()
     # The argument is the remaining string on the command line
     # Return true to exit from the command loop
diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py
index b2b78f1ab9ecca..71240157e324a1 100644
--- a/Lib/test/test_pdb.py
+++ b/Lib/test/test_pdb.py
@@ -496,6 +496,37 @@ def test_pdb_pp_repr_exc():
     (Pdb) continue
     """
 
+def test_pdb_empty_line():
+    """Test that empty line repeats the last command.
+
+    >>> def test_function():
+    ...     x = 1
+    ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
+    ...     y = 2
+
+    >>> with PdbTestInput([  # doctest: +NORMALIZE_WHITESPACE
+    ...     'p x',
+    ...     '',  # Should repeat p x
+    ...     'n ;; p 0 ;; p x',  # Fill cmdqueue with multiple commands
+    ...     '',  # Should still repeat p x
+    ...     'continue',
+    ... ]):
+    ...    test_function()
+    > <doctest test.test_pdb.test_pdb_empty_line[0]>(3)test_function()
+    -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
+    (Pdb) p x
+    1
+    (Pdb)
+    1
+    (Pdb) n ;; p 0 ;; p x
+    0
+    1
+    > <doctest test.test_pdb.test_pdb_empty_line[0]>(4)test_function()
+    -> y = 2
+    (Pdb)
+    1
+    (Pdb) continue
+    """
 
 def do_nothing():
     pass
diff --git 
a/Misc/NEWS.d/next/Library/2024-06-20-01-31-24.gh-issue-120769.PfiMrc.rst 
b/Misc/NEWS.d/next/Library/2024-06-20-01-31-24.gh-issue-120769.PfiMrc.rst
new file mode 100644
index 00000000000000..8ee6bf1a9c6480
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2024-06-20-01-31-24.gh-issue-120769.PfiMrc.rst
@@ -0,0 +1 @@
+Make empty line in :mod:`pdb` repeats the last command even when the command 
is from ``cmdqueue``.

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]

Reply via email to