Changeset 388 for python/vendor/current/Lib/bdb.py
- Timestamp:
- Mar 19, 2014, 11:11:30 AM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
python/vendor/current/Lib/bdb.py
r2 r388 1 1 """Debugger basics""" 2 2 3 import fnmatch 3 4 import sys 4 5 import os … … 20 21 """ 21 22 22 def __init__(self): 23 def __init__(self, skip=None): 24 self.skip = set(skip) if skip else None 23 25 self.breaks = {} 24 26 self.fncache = {} 27 self.frame_returning = None 25 28 26 29 def canonic(self, filename): … … 81 84 def dispatch_return(self, frame, arg): 82 85 if self.stop_here(frame) or frame == self.returnframe: 83 self.user_return(frame, arg) 86 try: 87 self.frame_returning = frame 88 self.user_return(frame, arg) 89 finally: 90 self.frame_returning = None 84 91 if self.quitting: raise BdbQuit 85 92 return self.trace_dispatch … … 95 102 # definition of stopping and breakpoints. 96 103 104 def is_skipped_module(self, module_name): 105 for pattern in self.skip: 106 if fnmatch.fnmatch(module_name, pattern): 107 return True 108 return False 109 97 110 def stop_here(self, frame): 98 111 # (CT) stopframe may now also be None, see dispatch_call. 99 112 # (CT) the former test for None is therefore removed from here. 113 if self.skip and \ 114 self.is_skipped_module(frame.f_globals.get('__name__')): 115 return False 100 116 if frame is self.stopframe: 117 if self.stoplineno == -1: 118 return False 101 119 return frame.f_lineno >= self.stoplineno 102 120 while frame is not None and frame is not self.stopframe: … … 156 174 pass 157 175 158 def _set_stopinfo(self, stopframe, returnframe, stoplineno= -1):176 def _set_stopinfo(self, stopframe, returnframe, stoplineno=0): 159 177 self.stopframe = stopframe 160 178 self.returnframe = returnframe 161 179 self.quitting = 0 180 # stoplineno >= 0 means: stop at line >= the stoplineno 181 # stoplineno -1 means: don't stop at all 162 182 self.stoplineno = stoplineno 163 183 … … 172 192 def set_step(self): 173 193 """Stop after one line of code.""" 174 self._set_stopinfo(None,None) 194 # Issue #13183: pdb skips frames after hitting a breakpoint and running 195 # step commands. 196 # Restore the trace function in the caller (that may not have been set 197 # for performance reasons) when returning from the current frame. 198 if self.frame_returning: 199 caller_frame = self.frame_returning.f_back 200 if caller_frame and not caller_frame.f_trace: 201 caller_frame.f_trace = self.trace_dispatch 202 self._set_stopinfo(None, None) 175 203 176 204 def set_next(self, frame): … … 199 227 def set_continue(self): 200 228 # Don't stop except at breakpoints or when finished 201 self._set_stopinfo(self.botframe, None )229 self._set_stopinfo(self.botframe, None, -1) 202 230 if not self.breaks: 203 231 # no breakpoints; run without debugger overhead … … 236 264 bp = Breakpoint(filename, lineno, temporary, cond, funcname) 237 265 266 def _prune_breaks(self, filename, lineno): 267 if (filename, lineno) not in Breakpoint.bplist: 268 self.breaks[filename].remove(lineno) 269 if not self.breaks[filename]: 270 del self.breaks[filename] 271 238 272 def clear_break(self, filename, lineno): 239 273 filename = self.canonic(filename) … … 247 281 for bp in Breakpoint.bplist[filename, lineno][:]: 248 282 bp.deleteMe() 249 if not Breakpoint.bplist.has_key((filename, lineno)): 250 self.breaks[filename].remove(lineno) 251 if not self.breaks[filename]: 252 del self.breaks[filename] 283 self._prune_breaks(filename, lineno) 253 284 254 285 def clear_bpbynumber(self, arg): … … 263 294 if not bp: 264 295 return 'Breakpoint (%d) already deleted' % number 265 self.clear_break(bp.file, bp.line) 296 bp.deleteMe() 297 self._prune_breaks(bp.file, bp.line) 266 298 267 299 def clear_all_file_breaks(self, filename): … … 454 486 # Build the two lists 455 487 self.bpbynumber.append(self) 456 if self.bplist.has_key((file, line)):488 if (file, line) in self.bplist: 457 489 self.bplist[file, line].append(self) 458 490 else:
Note:
See TracChangeset
for help on using the changeset viewer.