summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSenthil Kumaran <orsenthil@gmail.com>2010-11-29 11:54:17 +0000
committerSenthil Kumaran <orsenthil@gmail.com>2010-11-29 11:54:17 +0000
commitc2117283926942da2cd93116635a74bb8713f4be (patch)
treeecf2e52163452a01c63e6d62a936b38984e7f9fe
parent951cc26dced198e860f23f734b01e2ccf2edd083 (diff)
downloadcpython-c2117283926942da2cd93116635a74bb8713f4be.tar.gz
Fix #10561 - Fix pdb behavior. Delete the breakpoints by breakpoint number.
Handle multiple breakpoints at same line. Update docs/test. Patch by Xavier de Gaye.
-rw-r--r--Doc/library/pdb.rst3
-rw-r--r--Lib/bdb.py14
-rwxr-xr-xLib/pdb.py3
-rw-r--r--Lib/test/test_pdb.py18
-rw-r--r--Misc/NEWS2
5 files changed, 31 insertions, 9 deletions
diff --git a/Doc/library/pdb.rst b/Doc/library/pdb.rst
index 98b23f6d02..3ef3696e6c 100644
--- a/Doc/library/pdb.rst
+++ b/Doc/library/pdb.rst
@@ -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).
diff --git a/Lib/bdb.py b/Lib/bdb.py
index e599847ce5..0cb2e922ca 100644
--- a/Lib/bdb.py
+++ b/Lib/bdb.py
@@ -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)
diff --git a/Lib/pdb.py b/Lib/pdb.py
index a159d4ccd7..f5d8c2a08a 100755
--- a/Lib/pdb.py
+++ b/Lib/pdb.py
@@ -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'
diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py
index 0d93b43e84..a778c6c6a6 100644
--- a/Lib/test/test_pdb.py
+++ b/Lib/test/test_pdb.py
@@ -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
diff --git a/Misc/NEWS b/Misc/NEWS
index 79171a5397..71cbc3267e 100644
--- 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.