diff -r 5c52e7c6d868 Lib/idlelib/Debugger.py --- a/Lib/idlelib/Debugger.py Mon Feb 27 00:45:12 2012 +0100 +++ b/Lib/idlelib/Debugger.py Sun Feb 26 21:59:19 2012 -0600 @@ -11,6 +11,7 @@ def __init__(self, gui): self.gui = gui + self._interrupt = 0 bdb.Bdb.__init__(self) def user_line(self, frame): @@ -47,6 +48,26 @@ message = "%s: %s()" % (message, code.co_name) return message + def user_interrupt(self, value): + old_value = self._interrupt + self._interrupt = value + return old_value + + def break_here(self, frame): + # If an interrupt occurred, then break. + if self._interrupt: + self._interrupt = 0 + return 1 + else: + return bdb.Bdb.break_here(self, frame) + + def set_continue(self): + bdb.Bdb.set_continue(self) + # The code in bdb will clear sys.settrace + # if there are no breakpoints. This resets + # it so that Ctrl-C still works. + if sys.gettrace() is None: + sys.settrace(self.trace_dispatch) class Debugger: @@ -215,22 +236,27 @@ return filename, lineno def cont(self): + self.idb.user_interrupt(0) self.idb.set_continue() self.root.quit() def step(self): + self.idb.user_interrupt(0) self.idb.set_step() self.root.quit() def next(self): + self.idb.user_interrupt(0) self.idb.set_next(self.frame) self.root.quit() def ret(self): + self.idb.user_interrupt(0) self.idb.set_return(self.frame) self.root.quit() def quit(self): + self.idb.user_interrupt(0) self.idb.set_quit() self.root.quit() diff -r 5c52e7c6d868 Lib/idlelib/PyShell.py --- a/Lib/idlelib/PyShell.py Mon Feb 27 00:45:12 2012 +0100 +++ b/Lib/idlelib/PyShell.py Sun Feb 26 21:59:19 2012 -0600 @@ -251,8 +251,8 @@ def ranges_to_linenumbers(self, ranges): lines = [] for index in range(0, len(ranges), 2): - lineno = int(float(ranges[index])) - end = int(float(ranges[index+1])) + lineno = int(float(str(ranges[index]))) + end = int(float(str(ranges[index+1]))) while lineno < end: lines.append(lineno) lineno += 1 @@ -1061,10 +1061,7 @@ self.endoffile = 0 self.canceled = 1 if (self.executing and self.interp.rpcclt): - if self.interp.getdebugger(): - self.interp.restart_subprocess() - else: - self.interp.interrupt_subprocess() + self.interp.interrupt_subprocess() if self.reading: self.top.quit() # exit the nested mainloop() in readline() return "break" diff -r 5c52e7c6d868 Lib/idlelib/RemoteDebugger.py --- a/Lib/idlelib/RemoteDebugger.py Mon Feb 27 00:45:12 2012 +0100 +++ b/Lib/idlelib/RemoteDebugger.py Sun Feb 26 21:59:19 2012 -0600 @@ -121,6 +121,9 @@ msg = self.idb.clear_all_file_breaks(filename) return msg + def user_interrupt(self, value): + return self.idb.user_interrupt(value) + #----------called by a FrameProxy---------- def frame_attr(self, fid, name): @@ -187,7 +190,7 @@ idb = Debugger.Idb(gui_proxy) idb_adap = IdbAdapter(idb) rpchandler.register(idb_adap_oid, idb_adap) - return idb_adap_oid + return idb_adap_oid, idb #======================================= @@ -335,6 +338,9 @@ msg = self.call("clear_all_file_breaks", filename) return msg + def user_interrupt(self, value): + return self.call("user_interrupt", value) + def start_remote_debugger(rpcclt, pyshell): """Start the subprocess debugger, initialize the debugger GUI and RPC link diff -r 5c52e7c6d868 Lib/idlelib/run.py --- a/Lib/idlelib/run.py Mon Feb 27 00:45:12 2012 +0100 +++ b/Lib/idlelib/run.py Sun Feb 26 21:59:19 2012 -0600 @@ -288,6 +288,7 @@ self.locals = __main__.__dict__ self.calltip = CallTips.CallTips() self.autocomplete = AutoComplete.AutoComplete() + self.idb = None def runcode(self, code): global interruptable @@ -313,13 +314,18 @@ def interrupt_the_server(self): if interruptable: thread.interrupt_main() + elif self.idb: + self.idb.user_interrupt(1) def start_the_debugger(self, gui_adap_oid): - return RemoteDebugger.start_debugger(self.rpchandler, gui_adap_oid) + idb_adap_oid, idb = RemoteDebugger.start_debugger(self.rpchandler, gui_adap_oid) + self.idb = idb + return idb_adap_oid def stop_the_debugger(self, idb_adap_oid): "Unregister the Idb Adapter. Link objects and Idb then subject to GC" self.rpchandler.unregister(idb_adap_oid) + self.idb = None def get_the_calltip(self, name): return self.calltip.fetch_tip(name)