From a54a628149ead7dfa11208f5dc2785d25fbc3639 Mon Sep 17 00:00:00 2001 From: Louie Lu Date: Wed, 24 May 2017 17:36:38 +0800 Subject: [PATCH] WIP --- Lib/idlelib/debugger.py | 25 +++++++++++++++++++++++++ Lib/idlelib/debugger_r.py | 9 ++++++++- Lib/idlelib/pyshell.py | 8 ++++---- Lib/idlelib/run.py | 8 +++++++- 4 files changed, 44 insertions(+), 6 deletions(-) diff --git a/Lib/idlelib/debugger.py b/Lib/idlelib/debugger.py index 114d0d128e..16e74f069a 100644 --- a/Lib/idlelib/debugger.py +++ b/Lib/idlelib/debugger.py @@ -13,6 +13,7 @@ class Idb(bdb.Bdb): def __init__(self, gui): self.gui = gui + self._interrupt = False bdb.Bdb.__init__(self) def user_line(self, frame): @@ -32,6 +33,25 @@ class Idb(bdb.Bdb): message = self.__frame2message(frame) self.gui.interaction(message, frame, info) + def user_interrupt(self, value): + old_value = self._interrupt + self._interrupt = value + return old_value + + def break_here(self, frame): + if self._interrupt: + self._interrupt = False + return True + 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) + def in_rpc_code(self, frame): if frame.f_code.co_filename.count('rpc.py'): return True @@ -265,22 +285,27 @@ class Debugger: return filename, lineno def cont(self): + self.idb.user_interrupt(False) self.idb.set_continue() self.abort_loop() def step(self): + self.idb.user_interrupt(False) self.idb.set_step() self.abort_loop() def next(self): + self.idb.user_interrupt(False) self.idb.set_next(self.frame) self.abort_loop() def ret(self): + self.idb.user_interrupt(False) self.idb.set_return(self.frame) self.abort_loop() def quit(self): + self.idb.user_interrupt(False) self.idb.set_quit() self.abort_loop() diff --git a/Lib/idlelib/debugger_r.py b/Lib/idlelib/debugger_r.py index bc971276de..7f9331b968 100644 --- a/Lib/idlelib/debugger_r.py +++ b/Lib/idlelib/debugger_r.py @@ -117,6 +117,9 @@ class IdbAdapter: 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): @@ -190,7 +193,7 @@ def start_debugger(rpchandler, gui_adap_oid): 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 #======================================= @@ -343,6 +346,10 @@ class IdbProxy: 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 --git a/Lib/idlelib/pyshell.py b/Lib/idlelib/pyshell.py index 5b0e5b2676..65daa80105 100755 --- a/Lib/idlelib/pyshell.py +++ b/Lib/idlelib/pyshell.py @@ -1087,10 +1087,10 @@ class PyShell(OutputWindow): 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() + # if self.interp.getdebugger(): + # self.interp.restart_subprocess() + # else: + self.interp.interrupt_subprocess() if self.reading: self.top.quit() # exit the nested mainloop() in readline() return "break" diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py index 12c339f105..5ee34ad72e 100644 --- a/Lib/idlelib/run.py +++ b/Lib/idlelib/run.py @@ -450,6 +450,7 @@ class Executive(object): self.locals = __main__.__dict__ self.calltip = calltips.CallTips() self.autocomplete = autocomplete.AutoComplete() + self.idb = None def runcode(self, code): global interruptable @@ -479,13 +480,18 @@ class Executive(object): def interrupt_the_server(self): if interruptable: thread.interrupt_main() + elif self.idb: + self.idb.user_interrupt(True) def start_the_debugger(self, gui_adap_oid): - return debugger_r.start_debugger(self.rpchandler, gui_adap_oid) + oid, idb = debugger_r.start_debugger(self.rpchandler, gui_adap_oid) + self.idb = idb + return 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) -- 2.12.0