diff options
-rw-r--r-- | Lib/idlelib/PyShell.py | 68 | ||||
-rw-r--r-- | Lib/idlelib/RemoteDebugger.py | 12 | ||||
-rw-r--r-- | Lib/idlelib/rpc.py | 5 |
3 files changed, 45 insertions, 40 deletions
diff --git a/Lib/idlelib/PyShell.py b/Lib/idlelib/PyShell.py index 9c51526..cbfd203 100644 --- a/Lib/idlelib/PyShell.py +++ b/Lib/idlelib/PyShell.py @@ -399,16 +399,16 @@ class ModifiedInterpreter(InteractiveInterpreter): self.tkconsole.resetoutput() self.active_seq = None how, what = response - file = self.tkconsole.console + console = self.tkconsole.console if how == "OK": if what is not None: - print >>file, `what` + print >>console, `what` elif how == "EXCEPTION": mod, name, args, tb = what - print >>file, 'Traceback (most recent call last):' - exclude = ("run.py", "rpc.py") - self.cleanup_traceback(tb, exclude) - traceback.print_list(tb, file=file) + print >>console, 'Traceback (most recent call last):' + exclude = ("run.py", "rpc.py", "RemoteDebugger.py", "bdb.py") + self.cleanup_traceback(tb, exclude, console) + traceback.print_list(tb, file=console) # try to reinstantiate the exception, stuff in the args: try: etype = eval(mod + '.' + name) @@ -419,18 +419,20 @@ class ModifiedInterpreter(InteractiveInterpreter): val = args lines = traceback.format_exception_only(etype, val) for line in lines[:-1]: - traceback._print(file, line, '') - traceback._print(file, lines[-1], '') + traceback._print(console, line, '') + traceback._print(console, lines[-1], '') if self.tkconsole.getvar("<<toggle-jit-stack-viewer>>"): self.remote_stack_viewer() elif how == "ERROR": errmsg = "PyShell.ModifiedInterpreter: Subprocess ERROR:\n" print >>sys.__stderr__, errmsg, what - print >>file, errmsg, what + print >>console, errmsg, what + # we received a response to the currently active seq number: self.tkconsole.endexecuting() - def cleanup_traceback(self, tb, exclude): + def cleanup_traceback(self, tb, exclude, console): "Remove excluded traces from beginning/end of tb; get cached lines" + orig_tb = tb[:] while tb: for rpcfile in exclude: if tb[0][0].count(rpcfile): @@ -445,6 +447,11 @@ class ModifiedInterpreter(InteractiveInterpreter): else: break del tb[-1] + if len(tb) == 0: + # error was in IDLE internals, don't prune! + tb[:] = orig_tb[:] + print>>sys.__stderr__, "** IDLE Internal Error: ", tb + print>>console, "** IDLE Internal Error **" for i in range(len(tb)): fn, ln, nm, line = tb[i] if nm == '?': @@ -617,31 +624,26 @@ class ModifiedInterpreter(InteractiveInterpreter): warnings.filters[:] = self.save_warnings_filters self.save_warnings_filters = None debugger = self.debugger - if not debugger and self.rpcclt is not None: - self.tkconsole.beginexecuting() - self.active_seq = self.rpcclt.asynccall("exec", "runcode", - (code,), {}) - return + self.tkconsole.beginexecuting() try: - self.tkconsole.beginexecuting() - try: - if debugger: - debugger.run(code, self.locals) - else: - exec code in self.locals - except SystemExit: - if tkMessageBox.askyesno( - "Exit?", - "Do you want to exit altogether?", - default="yes", - master=self.tkconsole.text): - raise - else: - self.showtraceback() - except: + if not debugger and self.rpcclt is not None: + self.active_seq = self.rpcclt.asynccall("exec", "runcode", + (code,), {}) + elif debugger: + debugger.run(code, self.locals) + else: + exec code in self.locals + except SystemExit: + if tkMessageBox.askyesno( + "Exit?", + "Do you want to exit altogether?", + default="yes", + master=self.tkconsole.text): + raise + else: self.showtraceback() - finally: - self.tkconsole.endexecuting() + except: + self.showtraceback() def write(self, s): "Override base class method" diff --git a/Lib/idlelib/RemoteDebugger.py b/Lib/idlelib/RemoteDebugger.py index 054b975..41f910f 100644 --- a/Lib/idlelib/RemoteDebugger.py +++ b/Lib/idlelib/RemoteDebugger.py @@ -287,19 +287,21 @@ class GUIAdapter: class IdbProxy: - def __init__(self, conn, oid): + def __init__(self, conn, shell, oid): self.oid = oid self.conn = conn + self.shell = shell def call(self, methodname, *args, **kwargs): - ##print "call %s %s %s" % (methodname, args, kwargs) + ##print "**IdbProxy.call %s %s %s" % (methodname, args, kwargs) value = self.conn.remotecall(self.oid, methodname, args, kwargs) - ##print "return %s" % `value` + ##print "**IdbProxy.call %s returns %s" % (methodname, `value`) return value def run(self, cmd, locals): # Ignores locals on purpose! - self.call("run", cmd) + seq = self.conn.asynccall(self.oid, "run", (cmd,), {}) + self.shell.interp.active_seq = seq def get_stack(self, frame, tbid): # passing frame and traceback IDs, not the objects themselves @@ -352,7 +354,7 @@ def start_remote_debugger(rpcclt, pyshell): idb_adap_oid = rpcclt.remotecall("exec", "start_the_debugger",\ (gui_adap_oid,), {}) - idb_proxy = IdbProxy(rpcclt, idb_adap_oid) + idb_proxy = IdbProxy(rpcclt, pyshell, idb_adap_oid) gui = Debugger.Debugger(pyshell, idb_proxy) gui_adap = GUIAdapter(rpcclt, gui) rpcclt.register(gui_adap_oid, gui_adap) diff --git a/Lib/idlelib/rpc.py b/Lib/idlelib/rpc.py index 40b1697..c7644e1 100644 --- a/Lib/idlelib/rpc.py +++ b/Lib/idlelib/rpc.py @@ -361,9 +361,10 @@ class SocketIO: seq, resq = message self.debug("pollresponse:%d:myseq:%s" % (seq, myseq)) if resq[0] == "call": - self.debug("pollresponse:%d:call_localcall" % seq) + self.debug("pollresponse:%d:localcall:call:" % seq) response = self.localcall(resq) - self.debug("pollresponse:%d:response:%s" % (seq, response)) + self.debug("pollresponse:%d:localcall:response:%s" + % (seq, response)) self.putmessage((seq, response)) continue elif seq == myseq: |