"""
import sys
+import types
import rpc
import Debugger
frametable = {}
dicttable = {}
codetable = {}
+tracebacktable = {}
def wrap_frame(frame):
fid = id(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:
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)),
{})
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]
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):
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:
# 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
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