summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/idlelib/PyShell.py24
-rw-r--r--Lib/idlelib/rpc.py35
2 files changed, 39 insertions, 20 deletions
diff --git a/Lib/idlelib/PyShell.py b/Lib/idlelib/PyShell.py
index 28dc256..27bae5f 100644
--- a/Lib/idlelib/PyShell.py
+++ b/Lib/idlelib/PyShell.py
@@ -11,6 +11,7 @@ import time
import traceback
import types
import warnings
+import exceptions
import linecache
from code import InteractiveInterpreter
@@ -340,6 +341,7 @@ class ModifiedInterpreter(InteractiveInterpreter):
if clt is None:
return
response = clt.pollresponse(self.active_seq)
+ # Reschedule myself in 50 ms
self.tkconsole.text.after(50, self.poll_subprocess)
if response:
self.tkconsole.resetoutput()
@@ -362,14 +364,24 @@ class ModifiedInterpreter(InteractiveInterpreter):
line = linecache.getline(fn, ln)
tb[i] = fn, ln, nm, line
traceback.print_list(tb, file=file)
- if mod and mod != "exceptions":
- name = mod + "." + name
- print >>file, name + ":", " ".join(map(str, args))
+ # try to reinstantiate the exception, stuff in the args:
+ try:
+ etype = eval(mod + '.' + name)
+ val = etype()
+ val.args = args
+ except TypeError: # string exception!
+ etype = name
+ val = args
+ lines = traceback.format_exception_only(etype, val)
+ for line in lines[:-1]:
+ traceback._print(file, line, '')
+ traceback._print(file, lines[-1], '')
if self.tkconsole.getvar("<<toggle-jit-stack-viewer>>"):
self.remote_stack_viewer()
elif how == "ERROR":
- print >>sys.__stderr__, "Oops:", how, what
- print >>file, "Oops:", how, what
+ errmsg = "PyShell.ModifiedInterpreter: Subprocess ERROR:\n"
+ print >>sys.__stderr__, errmsg, what
+ print >>file, errmsg, what
self.tkconsole.endexecuting()
def kill_subprocess(self):
@@ -416,6 +428,8 @@ class ModifiedInterpreter(InteractiveInterpreter):
code = compile(source, filename, "exec")
except (OverflowError, SyntaxError):
self.tkconsole.resetoutput()
+ console = self.tkconsole.console
+ print >>console, 'Traceback (most recent call last):'
InteractiveInterpreter.showsyntaxerror(self, filename)
self.tkconsole.showprompt()
else:
diff --git a/Lib/idlelib/rpc.py b/Lib/idlelib/rpc.py
index 4bbf0bb..3f1a746 100644
--- a/Lib/idlelib/rpc.py
+++ b/Lib/idlelib/rpc.py
@@ -90,8 +90,6 @@ objecttable = {}
class SocketIO:
- debugging = False
-
def __init__(self, sock, objtable=None, debugging=None):
self.mainthread = threading.currentThread()
if debugging is not None:
@@ -113,11 +111,10 @@ class SocketIO:
def debug(self, *args):
if not self.debugging:
return
- s = str(threading.currentThread().getName())
+ s = self.location + " " + str(threading.currentThread().getName())
for a in args:
s = s + " " + str(a)
- s = s + "\n"
- sys.__stderr__.write(s)
+ print>>sys.__stderr__, s
def register(self, oid, object):
self.objtable[oid] = object
@@ -159,7 +156,7 @@ class SocketIO:
typ, val, tb = info = sys.exc_info()
sys.last_type, sys.last_value, sys.last_traceback = info
if isinstance(typ, type(Exception)):
- # Class exceptions
+ # Class exception
mod = typ.__module__
name = typ.__name__
if issubclass(typ, Exception):
@@ -167,29 +164,29 @@ class SocketIO:
else:
args = (str(val),)
else:
- # String exceptions
+ # User string exception
mod = None
name = typ
- args = (str(val),)
+ if val is None: val = ''
+ args = str(val)
tb = traceback.extract_tb(tb)
+ self.debug("localcall:EXCEPTION: ", mod, name, args, tb)
return ("EXCEPTION", (mod, name, args, tb))
def remotecall(self, oid, methodname, args, kwargs):
- self.debug("remotecall:", oid, methodname, args, kwargs)
+ self.debug("remotecall:")
seq = self.asynccall(oid, methodname, args, kwargs)
- ret = self.asyncreturn(seq)
- self.debug("return:", ret)
- return ret
+ return self.asyncreturn(seq)
def asynccall(self, oid, methodname, args, kwargs):
- self.debug("asyncall:", oid, methodname, args, kwargs)
request = ("call", (oid, methodname, args, kwargs))
seq = self.putrequest(request)
+ self.debug(("asyncall:%d:" % seq), oid, methodname, args, kwargs)
return seq
def asyncreturn(self, seq):
response = self.getresponse(seq)
- self.debug("asyncreturn:", response)
+ self.debug(("asyncreturn:%d:" % seq), response)
return self.decoderesponse(response)
def decoderesponse(self, response):
@@ -197,6 +194,7 @@ class SocketIO:
if how == "OK":
return what
if how == "EXCEPTION":
+ self.debug("decoderesponse: Internal EXCEPTION:", what)
mod, name, args, tb = what
self.traceback = tb
if mod: # not string exception
@@ -217,6 +215,7 @@ class SocketIO:
# do the best we can:
raise name, args
if how == "ERROR":
+ self.debug("decoderesponse: Internal ERROR:", what)
raise RuntimeError, what
raise SystemError, (how, what)
@@ -274,6 +273,7 @@ class SocketIO:
return seq
def putmessage(self, message):
+ ##self.debug("putmessage: ", message)
try:
s = pickle.dumps(message)
except:
@@ -345,6 +345,7 @@ class SocketIO:
wait = 0.0
seq, resq = message
if resq[0] == "call":
+ self.debug("call_localcall:%d:" % seq)
response = self.localcall(resq)
self.putmessage((seq, response))
continue
@@ -377,7 +378,8 @@ class RemoteProxy:
class RPCHandler(SocketServer.BaseRequestHandler, SocketIO):
- debugging = 0
+ debugging = False
+ location = "#S" # Server
def __init__(self, sock, addr, svr):
svr.current_handler = self ## cgt xxx
@@ -393,6 +395,9 @@ class RPCHandler(SocketServer.BaseRequestHandler, SocketIO):
class RPCClient(SocketIO):
+ debugging = False
+ location = "#C" # Client
+
nextseq = 1 # Requests coming from the client are odd numbered
def __init__(self, address, family=socket.AF_INET, type=socket.SOCK_STREAM):