From 6ea27cc2c6659b040a16c829fa51a66eefc23925 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Mon, 25 Jan 1999 20:51:34 +0000 Subject: [PATCH] Change clear_break() to the old signature clear_break(file, line). Add new clear_bpbynumber() with single bpno argument. (Adapted from a patch by Richard Wolff.) Also some cleanup in error messages and moved some comments into a docstring. --- Lib/bdb.py | 66 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 40 insertions(+), 26 deletions(-) diff --git a/Lib/bdb.py b/Lib/bdb.py index 9a1551450b2..bc38607f893 100644 --- a/Lib/bdb.py +++ b/Lib/bdb.py @@ -1,10 +1,4 @@ -# A generic Python debugger base class. -# This class takes care of details of the trace facility; -# a derived class should implement user interaction. -# There are two debuggers based upon this: -# 'pdb', a text-oriented debugger not unlike dbx or gdb; -# and 'wdb', a window-oriented debugger. -# And of course... you can roll your own! +# Debugger basics import sys import types @@ -12,8 +6,15 @@ BdbQuit = 'bdb.BdbQuit' # Exception to give up completely -class Bdb: # Basic Debugger +class Bdb: + """Generic Python debugger base class. + + This class takes care of details of the trace facility; + a derived class should implement user interaction. + The standard debugger class (pdb.Pdb) is an example. + """ + def __init__(self): self.breaks = {} @@ -193,40 +194,46 @@ def set_break(self, filename, lineno, temporary=0, cond = None): import linecache # Import as late as possible line = linecache.getline(filename, lineno) if not line: - return 'That line does not exist!' + return 'Line %s:%d does not exist' % (filename, + lineno) if not self.breaks.has_key(filename): self.breaks[filename] = [] list = self.breaks[filename] if not lineno in list: list.append(lineno) bp = Breakpoint(filename, lineno, temporary, cond) - print 'Breakpoint %d, at %s:%d.' %(bp.number, filename, lineno) - def clear_break(self, arg): - try: - number = int(arg) - bp = Breakpoint.bpbynumber[int(arg)] - except: - return 'Invalid argument' - if not bp: - return 'Breakpoint already deleted' - filename = bp.file - lineno = bp.line + def clear_break(self, filename, lineno): if not self.breaks.has_key(filename): - return 'There are no breakpoints in that file!' + return 'There are no breakpoints in %s' % filename if lineno not in self.breaks[filename]: - return 'There is no breakpoint there!' + return 'There is no breakpoint at %s:%d' % (filename, + lineno) # If there's only one bp in the list for that file,line # pair, then remove the breaks entry - if len(Breakpoint.bplist[filename, lineno]) == 1: + for bp in Breakpoint.bplist[filename, lineno][:]: + bp.deleteMe() + if not Breakpoint.bplist.has_key((filename, lineno)): self.breaks[filename].remove(lineno) if not self.breaks[filename]: del self.breaks[filename] - bp.deleteMe() + def clear_bpbynumber(self, arg): + try: + number = int(arg) + except: + return 'Non-numeric breakpoint number (%s)' % arg + try: + bp = Breakpoint.bpbynumber[number] + except IndexError: + return 'Breakpoint number (%d) out of range' % number + if not bp: + return 'Breakpoint (%d) already deleted' % number + self.clear_break(bp.file, bp.line) + def clear_all_file_breaks(self, filename): if not self.breaks.has_key(filename): - return 'There are no breakpoints in that file!' + return 'There are no breakpoints in %s' % filename for line in self.breaks[filename]: blist = Breakpoint.bplist[filename, line] for bp in blist: @@ -235,7 +242,7 @@ def clear_all_file_breaks(self, filename): def clear_all_breaks(self): if not self.breaks: - return 'There are no breakpoints!' + return 'There are no breakpoints' for bp in Breakpoint.bpbynumber: if bp: bp.deleteMe() @@ -245,6 +252,11 @@ def get_break(self, filename, lineno): return self.breaks.has_key(filename) and \ lineno in self.breaks[filename] + def get_breaks(self, filename, lineno): + return self.breaks.has_key(filename) and \ + lineno in self.breaks[filename] and \ + Breakpoint.bplist[filename, line] or [] + def get_file_breaks(self, filename): if self.breaks.has_key(filename): return self.breaks[filename] @@ -381,6 +393,8 @@ class Breakpoint: """ + # XXX Keeping state in the class is a mistake -- this means + # you cannot have more than one active Bdb instance. next = 1 # Next bp to be assigned bplist = {} # indexed by (file, lineno) tuple