Fix #10561 - Fix pdb behavior. Delete the breakpoints by breakpoint number.
authorSenthil Kumaran <orsenthil@gmail.com>
Mon, 29 Nov 2010 11:54:17 +0000 (11:54 +0000)
committerSenthil Kumaran <orsenthil@gmail.com>
Mon, 29 Nov 2010 11:54:17 +0000 (11:54 +0000)
Handle multiple breakpoints at same line. Update docs/test.
Patch by Xavier de Gaye.

Doc/library/pdb.rst
Lib/bdb.py
Lib/pdb.py
Lib/test/test_pdb.py
Misc/NEWS

index 98b23f6d0233d1ee4feb93d5185d1e697fdfd0cb..3ef3696e6c9349eb96cd919e6c1304331c6ec870 100644 (file)
@@ -256,8 +256,9 @@ by the local file.
    Temporary breakpoint, which is removed automatically when it is first hit.
    The arguments are the same as for :pdbcmd:`break`.
 
-.. pdbcommand:: cl(ear) [bpnumber [bpnumber ...]]
+.. pdbcommand:: cl(ear) [filename:lineno | bpnumber [bpnumber ...]]
 
+   With a *filename:lineno* argument, clear all the breakpoints at this line.
    With a space separated list of breakpoint numbers, clear those breakpoints.
    Without argument, clear all breaks (but first ask confirmation).
 
index e599847ce52c229429d7ebceeae5dd2ddbfa49e9..0cb2e922cab05e3bbf0f1ac1931bf959d66c141e 100644 (file)
@@ -252,6 +252,12 @@ class Bdb:
             list.append(lineno)
         bp = Breakpoint(filename, lineno, temporary, cond, funcname)
 
+    def _prune_breaks(self, filename, lineno):
+        if (filename, lineno) not in Breakpoint.bplist:
+            self.breaks[filename].remove(lineno)
+        if not self.breaks[filename]:
+            del self.breaks[filename]
+
     def clear_break(self, filename, lineno):
         filename = self.canonic(filename)
         if not filename in self.breaks:
@@ -263,17 +269,15 @@ class Bdb:
         # pair, then remove the breaks entry
         for bp in Breakpoint.bplist[filename, lineno][:]:
             bp.deleteMe()
-        if (filename, lineno) not in Breakpoint.bplist:
-            self.breaks[filename].remove(lineno)
-        if not self.breaks[filename]:
-            del self.breaks[filename]
+        self._prune_breaks(filename, lineno)
 
     def clear_bpbynumber(self, arg):
         try:
             bp = self.get_bpbynumber(arg)
         except ValueError as err:
             return str(err)
-        self.clear_break(bp.file, bp.line)
+        bp.deleteMe()
+        self._prune_breaks(bp.file, bp.line)
 
     def clear_all_file_breaks(self, filename):
         filename = self.canonic(filename)
index a159d4ccd75468dbad89270a2bbb2459521c71da..f5d8c2a08a572f7d518069be7f4ae14fcf6ff05f 100755 (executable)
@@ -774,7 +774,8 @@ class Pdb(bdb.Bdb, cmd.Cmd):
             except ValueError as err:
                 self.error(err)
             else:
-                self.clear_break(bp.file, bp.line)
+                self.clear_bpbynumber(i)
+                #self.clear_break(bp.file, bp.line)
                 self.message('Deleted %s' % bp)
     do_cl = do_clear # 'c' is already an abbreviation for 'continue'
 
index 0d93b43e84bdb12011ea6ccb5495916266c3f07a..a778c6c6a613933041e53e69f511f8064065bed0 100644 (file)
@@ -192,6 +192,9 @@ def test_pdb_breakpoint_commands():
     ...     'ignore 1 10',
     ...     'condition 1 1 < 2',
     ...     'break 4',
+    ...     'break 4',
+    ...     'break',
+    ...     'clear 3',
     ...     'break',
     ...     'condition 1',
     ...     'enable 1',
@@ -220,6 +223,17 @@ def test_pdb_breakpoint_commands():
     New condition set for breakpoint 1.
     (Pdb) break 4
     Breakpoint 2 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4
+    (Pdb) break 4
+    Breakpoint 3 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4
+    (Pdb) break
+    Num Type         Disp Enb   Where
+    1   breakpoint   keep no    at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:3
+            stop only if 1 < 2
+            ignore next 10 hits
+    2   breakpoint   keep yes   at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4
+    3   breakpoint   keep yes   at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4
+    (Pdb) clear 3
+    Deleted breakpoint 3 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4
     (Pdb) break
     Num Type         Disp Enb   Where
     1   breakpoint   keep no    at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:3
@@ -244,10 +258,10 @@ def test_pdb_breakpoint_commands():
     Clear all breaks? y
     Deleted breakpoint 2 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:4
     (Pdb) tbreak 5
-    Breakpoint 3 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:5
+    Breakpoint 4 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:5
     (Pdb) continue
     2
-    Deleted breakpoint 3 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:5
+    Deleted breakpoint 4 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:5
     > <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>(5)test_function()
     -> print(3)
     (Pdb) break
index 79171a53978bbf8d642021c3fde9f3bdf0ec32fa..71cbc3267e72105b0f33c8ad83d6701b48fa4fc1 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -49,6 +49,8 @@ Library
 - Issue #10242: Fixed implementation of unittest.ItemsEqual and gave it
   a new more informative name, unittest.CountEqual.
 
+- Issue #10561: In pdb, clear the breakpoints by the breakpoint number.
+
 - Issue #2986: difflib.SequenceMatcher gets a new parameter, autojunk, which
   can be set to False to turn off the previously undocumented 'popularity'
   heuristic. Patch by Terry Reedy and Eli Bendersky.