summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKurt B. Kaiser <kbk@shore.net>2002-07-03 03:55:43 (GMT)
committerKurt B. Kaiser <kbk@shore.net>2002-07-03 03:55:43 (GMT)
commitf50d0f96a22c3316e023e7a1b6441baf4d54ece3 (patch)
tree40a3ec5e98f021a5fb847aa7f22d9f63a7b7a976
parent1de41bfbc0afadc0b1fa2f4076b54385fa5b33ba (diff)
downloadcpython-f50d0f96a22c3316e023e7a1b6441baf4d54ece3.zip
cpython-f50d0f96a22c3316e023e7a1b6441baf4d54ece3.tar.gz
cpython-f50d0f96a22c3316e023e7a1b6441baf4d54ece3.tar.bz2
Debugger Exception Info and GUI Stack Exception Traceback: finish
implementation.
-rw-r--r--Lib/idlelib/RemoteDebugger.py33
1 files changed, 23 insertions, 10 deletions
diff --git a/Lib/idlelib/RemoteDebugger.py b/Lib/idlelib/RemoteDebugger.py
index 3307239..84e94df 100644
--- a/Lib/idlelib/RemoteDebugger.py
+++ b/Lib/idlelib/RemoteDebugger.py
@@ -21,6 +21,7 @@ barrier, in particular frame and traceback objects.
"""
import sys
+import types
import rpc
import Debugger
@@ -33,6 +34,7 @@ debugging = 0
frametable = {}
dicttable = {}
codetable = {}
+tracebacktable = {}
def wrap_frame(frame):
fid = id(frame)
@@ -40,10 +42,16 @@ def wrap_frame(frame):
return fid
def wrap_info(info):
+ "replace info[2], a traceback instance, by its ID"
if info is None:
return None
else:
- return None # XXX for now
+ traceback = info[2]
+ assert isinstance(traceback, types.TracebackType)
+ traceback_id = id(traceback)
+ tracebacktable[traceback_id] = traceback
+ modified_info = (info[0], info[1], traceback_id)
+ return modified_info
class GUIProxy:
@@ -53,6 +61,7 @@ class GUIProxy:
def interaction(self, message, frame, info=None):
# calls rpc.SocketIO.remotecall() via run.MyHandler instance
+ # pass frame and traceback object IDs instead of the objects themselves
self.conn.remotecall(self.oid, "interaction",
(message, wrap_frame(frame), wrap_info(info)),
{})
@@ -84,7 +93,10 @@ class IdbAdapter:
def get_stack(self, fid, tbid):
##print >>sys.__stderr__, "get_stack(%s, %s)" % (`fid`, `tbid`)
frame = frametable[fid]
- tb = None # XXX for now
+ if tbid is None:
+ tb = None
+ else:
+ tb = tracebacktable[tbid]
stack, i = self.idb.get_stack(frame, tb)
##print >>sys.__stderr__, "get_stack() ->", stack
stack = [(wrap_frame(frame), k) for frame, k in stack]
@@ -104,7 +116,8 @@ class IdbAdapter:
def clear_all_file_breaks(self, filename):
msg = self.idb.clear_all_file_breaks(filename)
-
+ return msg
+
#----------called by a FrameProxy----------
def frame_attr(self, fid, name):
@@ -263,11 +276,10 @@ class GUIAdapter:
self.conn = conn
self.gui = gui
- def interaction(self, message, fid, iid):
- ##print "interaction: (%s, %s, %s)" % (`message`,`fid`, `iid`)
+ def interaction(self, message, fid, modified_info):
+ ##print "interaction: (%s, %s, %s)" % (message, fid, modified_info)
frame = FrameProxy(self.conn, fid)
- info = None # XXX for now
- self.gui.interaction(message, frame, info)
+ self.gui.interaction(message, frame, modified_info)
class IdbProxy:
@@ -286,8 +298,9 @@ class IdbProxy:
# Ignores locals on purpose!
self.call("run", cmd)
- def get_stack(self, frame, tb):
- stack, i = self.call("get_stack", frame._fid, None)
+ def get_stack(self, frame, tbid):
+ # passing frame and traceback IDs, not the objects themselves
+ stack, i = self.call("get_stack", frame._fid, tbid)
stack = [(FrameProxy(self.conn, fid), k) for fid, k in stack]
return stack, i
@@ -315,7 +328,7 @@ class IdbProxy:
def clear_all_file_breaks(self, filename):
msg = self.call("clear_all_file_breaks", filename)
-
+ return msg
def start_remote_debugger(rpcclt, pyshell):
"""Start the subprocess debugger, initialize the debugger GUI and RPC link