]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-120769: Add pdb meta command to print frame status. (#120770)
authorTian Gao <gaogaotiantian@hotmail.com>
Thu, 20 Jun 2024 17:38:07 +0000 (10:38 -0700)
committerGitHub <noreply@github.com>
Thu, 20 Jun 2024 17:38:07 +0000 (10:38 -0700)
Lib/pdb.py
Lib/test/test_pdb.py
Misc/NEWS.d/next/Library/2024-06-20-01-31-24.gh-issue-120769.PfiMrc.rst [new file with mode: 0644]

index b1be207a9fa98a0f19f25f614c7f3c0ef204506b..4af16d0a087c8c2851fb311862d61a9da39a578d 100644 (file)
@@ -517,7 +517,7 @@ class Pdb(bdb.Bdb, cmd.Cmd):
 
     # 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 @@ class Pdb(bdb.Bdb, cmd.Cmd):
             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 @@ class Pdb(bdb.Bdb, cmd.Cmd):
         """
         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 @@ class Pdb(bdb.Bdb, cmd.Cmd):
             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
index b2b78f1ab9eccafea8c30178c1a23827b8d4ce66..71240157e324a15b5cfdc253a3c3cab316c0d6a9 100644 (file)
@@ -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 (file)
index 0000000..8ee6bf1
--- /dev/null
@@ -0,0 +1 @@
+Make empty line in :mod:`pdb` repeats the last command even when the command is from ``cmdqueue``.