Support a canonical() method, implementable by a derived class, to be

applied to all filenames before they are compared, looked up in the
breaks dictionary, etc.  The default implementation does nothing --
it's implented as fast as possible via str().  A useful implementation
would make everything a absolute, e.g. return os.path.normcase(
os.path.abspath(filename)).
This commit is contained in:
Guido van Rossum 1999-01-29 22:03:51 +00:00
parent f761287e0a
commit 170e190f26
1 changed files with 20 additions and 6 deletions

View File

@ -17,6 +17,12 @@ class Bdb:
def __init__(self): def __init__(self):
self.breaks = {} self.breaks = {}
# We want to have a method self.canonic() which
# canonicalizes filenames before comparing them
# but we want the default to be a very fast no-op.
# Solution: the built-in str function.
if not hasattr(self, "canonic"):
self.canonic = str
def reset(self): def reset(self):
import linecache import linecache
@ -86,7 +92,7 @@ def stop_here(self, frame):
return 0 return 0
def break_here(self, frame): def break_here(self, frame):
filename=frame.f_code.co_filename filename = self.canonic(frame.f_code.co_filename)
if not self.breaks.has_key(filename): if not self.breaks.has_key(filename):
return 0 return 0
lineno = frame.f_lineno lineno = frame.f_lineno
@ -103,7 +109,8 @@ def break_here(self, frame):
return 0 return 0
def break_anywhere(self, frame): def break_anywhere(self, frame):
return self.breaks.has_key(frame.f_code.co_filename) return self.breaks.has_key(
self.canonic(frame.f_code.co_filename))
# Derived classes should override the user_* methods # Derived classes should override the user_* methods
# to gain control. # to gain control.
@ -191,6 +198,7 @@ def set_quit(self):
# for bp in Breakpoint.bpbynumber: if bp: bp.bpprint(). # for bp in Breakpoint.bpbynumber: if bp: bp.bpprint().
def set_break(self, filename, lineno, temporary=0, cond = None): def set_break(self, filename, lineno, temporary=0, cond = None):
filename = self.canonic(filename)
import linecache # Import as late as possible import linecache # Import as late as possible
line = linecache.getline(filename, lineno) line = linecache.getline(filename, lineno)
if not line: if not line:
@ -202,8 +210,10 @@ def set_break(self, filename, lineno, temporary=0, cond = None):
if not lineno in list: if not lineno in list:
list.append(lineno) list.append(lineno)
bp = Breakpoint(filename, lineno, temporary, cond) bp = Breakpoint(filename, lineno, temporary, cond)
print "Breakpoint in", filename, "at", lineno
def clear_break(self, filename, lineno): def clear_break(self, filename, lineno):
filename = self.canonic(filename)
if not self.breaks.has_key(filename): if not self.breaks.has_key(filename):
return 'There are no breakpoints in %s' % filename return 'There are no breakpoints in %s' % filename
if lineno not in self.breaks[filename]: if lineno not in self.breaks[filename]:
@ -232,6 +242,7 @@ def clear_bpbynumber(self, arg):
self.clear_break(bp.file, bp.line) self.clear_break(bp.file, bp.line)
def clear_all_file_breaks(self, filename): def clear_all_file_breaks(self, filename):
filename = self.canonic(filename)
if not self.breaks.has_key(filename): if not self.breaks.has_key(filename):
return 'There are no breakpoints in %s' % filename return 'There are no breakpoints in %s' % filename
for line in self.breaks[filename]: for line in self.breaks[filename]:
@ -249,15 +260,18 @@ def clear_all_breaks(self):
self.breaks = {} self.breaks = {}
def get_break(self, filename, lineno): def get_break(self, filename, lineno):
filename = self.canonic(filename)
return self.breaks.has_key(filename) and \ return self.breaks.has_key(filename) and \
lineno in self.breaks[filename] lineno in self.breaks[filename]
def get_breaks(self, filename, lineno): def get_breaks(self, filename, lineno):
filename = self.canonic(filename)
return self.breaks.has_key(filename) and \ return self.breaks.has_key(filename) and \
lineno in self.breaks[filename] and \ lineno in self.breaks[filename] and \
Breakpoint.bplist[filename, lineno] or [] Breakpoint.bplist[filename, lineno] or []
def get_file_breaks(self, filename): def get_file_breaks(self, filename):
filename = self.canonic(filename)
if self.breaks.has_key(filename): if self.breaks.has_key(filename):
return self.breaks[filename] return self.breaks[filename]
else: else:
@ -290,7 +304,7 @@ def get_stack(self, f, t):
def format_stack_entry(self, frame_lineno, lprefix=': '): def format_stack_entry(self, frame_lineno, lprefix=': '):
import linecache, repr, string import linecache, repr, string
frame, lineno = frame_lineno frame, lineno = frame_lineno
filename = frame.f_code.co_filename filename = self.canonic(frame.f_code.co_filename)
s = filename + '(' + `lineno` + ')' s = filename + '(' + `lineno` + ')'
if frame.f_code.co_name: if frame.f_code.co_name:
s = s + frame.f_code.co_name s = s + frame.f_code.co_name
@ -403,7 +417,7 @@ class Breakpoint:
# effective break .... see effective() # effective break .... see effective()
def __init__(self, file, line, temporary=0, cond = None): def __init__(self, file, line, temporary=0, cond = None):
self.file = file self.file = file # This better be in canonical form!
self.line = line self.line = line
self.temporary = temporary self.temporary = temporary
self.cond = cond self.cond = cond
@ -519,7 +533,7 @@ def user_line(self, frame):
import linecache, string import linecache, string
name = frame.f_code.co_name name = frame.f_code.co_name
if not name: name = '???' if not name: name = '???'
fn = frame.f_code.co_filename fn = self.canonic(frame.f_code.co_filename)
line = linecache.getline(fn, frame.f_lineno) line = linecache.getline(fn, frame.f_lineno)
print '+++', fn, frame.f_lineno, name, ':', string.strip(line) print '+++', fn, frame.f_lineno, name, ':', string.strip(line)
def user_return(self, frame, retval): def user_return(self, frame, retval):