--- pdb.py 2010-06-24 07:29:45.912957098 -0700 +++ pdb_new.py 2010-06-24 08:30:25.348547160 -0700 @@ -604,45 +604,49 @@ do_w = do_where do_bt = do_where + def steps_arg(self, cmd, arg): + """Parse up/down #steps numeric argument. + Return None if bad numeric argument, 1 if no argument, + otherwise the value of the argument. If the user specifies a + negative number, return a large integer, which is then + capped by our caller at the actual number of steps + possible.""" + val = 1 + if arg: + try: + val = int(arg) + except: + print >>self.stdout, "Usage : %s [#steps]" % cmd + return None + if val < 0: + val = 999999999 + return val + def do_up(self, arg): - nup = 1 - if arg: - try: - nup = int(arg) - if nup < 0: - nup = self.curindex - except: - pass - - for _ignore in xrange(nup): - if self.curindex is 0: - print >>self.stdout, '*** Oldest frame' - break - self.curindex -= 1 - self.curframe = self.stack[self.curindex][0] - self.lineno = None - self.print_stack_entry(self.stack[self.curindex]) + nup = self.steps_arg("up", arg) + if nup is None: + return + nup = min(nup, self.curindex) + self.curindex -= nup + self.curframe = self.stack[self.curindex][0] + self.lineno = None + if self.curindex is 0: + print >>self.stdout, '*** Oldest frame' + self.print_stack_entry(self.stack[self.curindex]) do_u = do_up def do_down(self, arg): - ndown = 1 - if arg: - try: - ndown = int(arg) - if ndown < 0: - ndown = len(self.stack) - self.curindex - except: - pass - - for _ignore in xrange(ndown): - if self.curindex + 1 is len(self.stack): - print >>self.stdout, '*** Newest frame' - break - self.curindex += 1 - self.curframe = self.stack[self.curindex][0] - self.lineno = None - self.print_stack_entry(self.stack[self.curindex]) + ndown = self.steps_arg("down", arg) + if ndown is None: + return + ndown = min(ndown, len(self.stack) - self.curindex - 1) + self.curindex += ndown + self.curframe = self.stack[self.curindex][0] + self.lineno = None + if (self.curindex + 1) is len(self.stack): + print >>self.stdout, '*** Newest frame' + self.print_stack_entry(self.stack[self.curindex]) do_d = do_down