Commit 9a5897bb authored by Senthil Kumaran's avatar Senthil Kumaran

Merged revisions 86861 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/branches/py3k

........
  r86861 | senthil.kumaran | 2010-11-29 19:54:17 +0800 (Mon, 29 Nov 2010) | 5 lines

  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.
........
parent 8244c575
...@@ -239,7 +239,8 @@ tbreak [[*filename*:]\ *lineno* | *function*\ [, *condition*]] ...@@ -239,7 +239,8 @@ tbreak [[*filename*:]\ *lineno* | *function*\ [, *condition*]]
Temporary breakpoint, which is removed automatically when it is first hit. The Temporary breakpoint, which is removed automatically when it is first hit. The
arguments are the same as break. arguments are the same as break.
cl(ear) [*bpnumber* [*bpnumber ...*]] 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. With a space separated list of breakpoint numbers, clear those breakpoints.
Without argument, clear all breaks (but first ask confirmation). Without argument, clear all breaks (but first ask confirmation).
......
...@@ -250,6 +250,12 @@ class Bdb: ...@@ -250,6 +250,12 @@ class Bdb:
list.append(lineno) list.append(lineno)
bp = Breakpoint(filename, lineno, temporary, cond, funcname) 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): def clear_break(self, filename, lineno):
filename = self.canonic(filename) filename = self.canonic(filename)
if not filename in self.breaks: if not filename in self.breaks:
...@@ -261,10 +267,7 @@ class Bdb: ...@@ -261,10 +267,7 @@ class Bdb:
# pair, then remove the breaks entry # pair, then remove the breaks entry
for bp in Breakpoint.bplist[filename, lineno][:]: for bp in Breakpoint.bplist[filename, lineno][:]:
bp.deleteMe() bp.deleteMe()
if (filename, lineno) not in Breakpoint.bplist: self._prune_breaks(filename, lineno)
self.breaks[filename].remove(lineno)
if not self.breaks[filename]:
del self.breaks[filename]
def clear_bpbynumber(self, arg): def clear_bpbynumber(self, arg):
try: try:
...@@ -277,7 +280,8 @@ class Bdb: ...@@ -277,7 +280,8 @@ class Bdb:
return 'Breakpoint number (%d) out of range' % number return 'Breakpoint number (%d) out of range' % number
if not bp: if not bp:
return 'Breakpoint (%d) already deleted' % number return 'Breakpoint (%d) already deleted' % number
self.clear_break(bp.file, bp.line) bp.deleteMe()
self._prune_breaks(bp.file, bp.line)
def clear_all_file_breaks(self, filename): def clear_all_file_breaks(self, filename):
filename = self.canonic(filename) filename = self.canonic(filename)
......
...@@ -54,6 +54,108 @@ def test_pdb_displayhook(): ...@@ -54,6 +54,108 @@ def test_pdb_displayhook():
(Pdb) continue (Pdb) continue
""" """
def test_pdb_breakpoint_commands():
"""Test basic commands related to breakpoints.
>>> def test_function():
... import pdb; pdb.Pdb().set_trace()
... print(1)
... print(2)
... print(3)
... print(4)
First, need to clear bdb state that might be left over from previous tests.
Otherwise, the new breakpoints might get assigned different numbers.
>>> from bdb import Breakpoint
>>> Breakpoint.next = 1
>>> Breakpoint.bplist = {}
>>> Breakpoint.bpbynumber = [None]
Now test the breakpoint commands. NORMALIZE_WHITESPACE is needed because
the breakpoint list outputs a tab for the "stop only" and "ignore next"
lines, which we don't want to put in here.
>>> with PdbTestInput([ # doctest: +NORMALIZE_WHITESPACE
... 'break 3',
... 'disable 1',
... 'ignore 1 10',
... 'condition 1 1 < 2',
... 'break 4',
... 'break 4',
... 'break',
... 'clear 3',
... 'break',
... 'condition 1',
... 'enable 1',
... 'clear 1',
... 'commands 2',
... 'print 42',
... 'end',
... 'continue', # will stop at breakpoint 2 (line 4)
... 'clear', # clear all!
... 'y',
... 'tbreak 5',
... 'continue', # will stop at temporary breakpoint
... 'break', # make sure breakpoint is gone
... 'continue',
... ]):
... test_function()
> <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>(3)test_function()
-> print(1)
(Pdb) break 3
Breakpoint 1 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:3
(Pdb) disable 1
(Pdb) ignore 1 10
Will ignore next 10 crossings of breakpoint 1.
(Pdb) condition 1 1 < 2
(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
(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
(Pdb) condition 1
Breakpoint 1 is now unconditional.
(Pdb) enable 1
(Pdb) clear 1
Deleted breakpoint 1
(Pdb) commands 2
(com) print 42
(com) end
(Pdb) continue
1
42
> <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>(4)test_function()
-> print(2)
(Pdb) clear
Clear all breaks? y
(Pdb) tbreak 5
Breakpoint 4 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:5
(Pdb) continue
2
Deleted breakpoint 4
> <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>(5)test_function()
-> print(3)
(Pdb) break
(Pdb) continue
3
4
"""
def test_pdb_skip_modules(): def test_pdb_skip_modules():
"""This illustrates the simple case of module skipping. """This illustrates the simple case of module skipping.
...@@ -138,6 +240,14 @@ def test_pdb_continue_in_bottomframe(): ...@@ -138,6 +240,14 @@ def test_pdb_continue_in_bottomframe():
... print(3) ... print(3)
... print(4) ... print(4)
First, need to clear bdb state that might be left over from previous tests.
Otherwise, the new breakpoints might get assigned different numbers.
>>> from bdb import Breakpoint
>>> Breakpoint.next = 1
>>> Breakpoint.bplist = {}
>>> Breakpoint.bpbynumber = [None]
>>> with PdbTestInput([ >>> with PdbTestInput([
... 'next', ... 'next',
... 'break 7', ... 'break 7',
......
...@@ -28,6 +28,8 @@ Library ...@@ -28,6 +28,8 @@ Library
- Issue #6098: Don't claim DOM level 3 conformance in minidom. - Issue #6098: Don't claim DOM level 3 conformance in minidom.
- Issue #10561: In pdb, clear the breakpoints by the breakpoint number.
- Issue #5762: Fix AttributeError raised by ``xml.dom.minidom`` when an empty - Issue #5762: Fix AttributeError raised by ``xml.dom.minidom`` when an empty
XML namespace attribute is encountered. XML namespace attribute is encountered.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment