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.
........
This commit is contained in:
Senthil Kumaran 2010-11-29 12:27:45 +00:00
parent a88d2776ef
commit 5170c81662
4 changed files with 123 additions and 6 deletions

View File

@ -235,7 +235,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).

View File

@ -249,6 +249,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:
@ -260,10 +266,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:
@ -276,7 +279,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)

View File

@ -54,6 +54,107 @@ 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 +239,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',
@ -168,6 +277,7 @@ def test_pdb_continue_in_bottomframe():
""" """
def test_main(): def test_main():
from test import test_pdb from test import test_pdb
support.run_doctest(test_pdb, verbosity=True) support.run_doctest(test_pdb, verbosity=True)

View File

@ -28,6 +28,8 @@ Core and Builtins
Library Library
------- -------
- Issue #10561: In pdb, clear the breakpoints by the breakpoint number.
- Issue #10459: Update CJK character names to Unicode 5.1. - Issue #10459: Update CJK character names to Unicode 5.1.
- Issue #10092: Properly reset locale in calendar.Locale*Calendar classes. - Issue #10092: Properly reset locale in calendar.Locale*Calendar classes.