Commit 5170c816 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 a88d2776
...@@ -235,7 +235,8 @@ tbreak [[*filename*:]\ *lineno* | *function*\ [, *condition*]] ...@@ -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).
......
...@@ -249,6 +249,12 @@ class Bdb: ...@@ -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: ...@@ -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: ...@@ -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)
......
...@@ -54,6 +54,107 @@ def test_pdb_displayhook(): ...@@ -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(): ...@@ -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(): ...@@ -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)
......
...@@ -28,6 +28,8 @@ Core and Builtins ...@@ -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.
......
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