diff options
-rw-r--r-- | Lib/idlelib/Debugger.py | 15 | ||||
-rw-r--r-- | Lib/idlelib/OldStackViewer.py | 6 | ||||
-rw-r--r-- | Lib/idlelib/PyShell.py | 3 | ||||
-rw-r--r-- | Lib/idlelib/RemoteDebugger.py | 74 | ||||
-rw-r--r-- | Lib/idlelib/rpc.py | 13 | ||||
-rw-r--r-- | Lib/idlelib/run.py | 4 |
6 files changed, 69 insertions, 46 deletions
diff --git a/Lib/idlelib/Debugger.py b/Lib/idlelib/Debugger.py index a483168..f5646e0 100644 --- a/Lib/idlelib/Debugger.py +++ b/Lib/idlelib/Debugger.py @@ -52,7 +52,7 @@ class Idb(bdb.Bdb): class Debugger: - interacting = 0 + # interacting = 0 # XXX KBK 14Jun02 move to __init__ vstack = vsource = vlocals = vglobals = None def __init__(self, pyshell, idb=None): @@ -60,8 +60,10 @@ class Debugger: idb = Idb(self) self.pyshell = pyshell self.idb = idb + self.frame = None self.make_gui() - + self.interacting = 0 + def run(self, *args): try: self.interacting = 1 @@ -155,7 +157,7 @@ class Debugger: if self.vglobals.get(): self.show_globals() - frame = None + # frame = None # XXX KBK 14Jun02 Move to __init__ def interaction(self, message, frame, info=None): self.frame = frame @@ -300,10 +302,11 @@ class Debugger: gdict = frame.f_globals if lv and gv and ldict is gdict: ldict = None + # Calls OldStackviewer.NamespaceViewer.load_dict(): if lv: - lv.load_dict(ldict, force) + lv.load_dict(ldict, force, self.pyshell.interp.rpcclt) if gv: - gv.load_dict(gdict, force) + gv.load_dict(gdict, force, self.pyshell.interp.rpcclt) def set_breakpoint_here(self, edit): text = edit.text @@ -312,7 +315,7 @@ class Debugger: text.bell() return lineno = int(float(text.index("insert"))) - msg = self.set_break(filename, lineno) + msg = self.idb.set_break(filename, lineno) if msg: text.bell() return diff --git a/Lib/idlelib/OldStackViewer.py b/Lib/idlelib/OldStackViewer.py index 2fa4127..c3df5ff 100644 --- a/Lib/idlelib/OldStackViewer.py +++ b/Lib/idlelib/OldStackViewer.py @@ -232,7 +232,7 @@ class NamespaceViewer: dict = -1 - def load_dict(self, dict, force=0): + def load_dict(self, dict, force=0, rpc_client=None): if dict is self.dict and not force: return subframe = self.subframe @@ -250,6 +250,10 @@ class NamespaceViewer: for name in names: value = dict[name] svalue = self.repr.repr(value) # repr(value) + # Strip extra quotes caused by calling repr on the (already) + # repr'd value sent across the RPC interface: + if rpc_client: + svalue = svalue[1:-1] l = Label(subframe, text=name) l.grid(row=row, column=0, sticky="nw") ## l = Label(subframe, text=svalue, justify="l", wraplength=300) diff --git a/Lib/idlelib/PyShell.py b/Lib/idlelib/PyShell.py index d335c7e..d84e2e1 100644 --- a/Lib/idlelib/PyShell.py +++ b/Lib/idlelib/PyShell.py @@ -529,6 +529,9 @@ class PyShell(OutputWindow): self.set_debugger_indicator() def open_debugger(self): + # XXX KBK 13Jun02 An RPC client always exists now? Open remote + # debugger and return...dike the rest of this fcn and combine + # with open_remote_debugger? if self.interp.rpcclt: return self.open_remote_debugger() import Debugger diff --git a/Lib/idlelib/RemoteDebugger.py b/Lib/idlelib/RemoteDebugger.py index 0f8eac5..5131065 100644 --- a/Lib/idlelib/RemoteDebugger.py +++ b/Lib/idlelib/RemoteDebugger.py @@ -24,6 +24,8 @@ import sys import rpc import Debugger +debugging = 0 + # In the PYTHON subprocess frametable = {} @@ -43,9 +45,9 @@ def wrap_info(info): class GUIProxy: - def __init__(self, conn, oid): + def __init__(self, conn, gui_adap_oid): self.conn = conn - self.oid = oid + self.oid = gui_adap_oid def interaction(self, message, frame, info=None): self.conn.remotecall(self.oid, "interaction", @@ -128,24 +130,25 @@ class IdbAdapter: def dict_item(self, did, key): dict = dicttable[did] value = dict[key] - try: - # Test for picklability - import cPickle - cPickle.dumps(value) - except: - value = None + value = repr(value) +# try: +# # Test for picklability +# import cPickle +# pklstr = cPickle.dumps(value) +# except: +# print >>sys.__stderr__, "** dict_item pickle failed: ", value +# raise +# #value = None return value -def start_debugger(conn, gui_oid): - # - # launched in the python subprocess - # - gui = GUIProxy(conn, gui_oid) - idb = Debugger.Idb(gui) - ada = IdbAdapter(idb) - ada_oid = "idb_adapter" - conn.register(ada_oid, ada) - return ada_oid +def start_debugger(conn, gui_adap_oid): + "Launch debugger in the remote python subprocess" + gui_proxy = GUIProxy(conn, gui_adap_oid) + idb = Debugger.Idb(gui_proxy) + idb_adap = IdbAdapter(idb) + idb_adap_oid = "idb_adapter" + conn.register(idb_adap_oid, idb_adap) + return idb_adap_oid # In the IDLE process @@ -223,14 +226,14 @@ class DictProxy: ##print >>sys.__stderr__, "failed DictProxy.__getattr__:", name raise AttributeError, name -class GUIAdaper: +class GUIAdapter: def __init__(self, conn, gui): self.conn = conn self.gui = gui def interaction(self, message, fid, iid): - print "interaction(%s, %s, %s)" % (`message`, `fid`, `iid`) + ##print "interaction: (%s, %s, %s)" % (`message`,`fid`, `iid`) frame = FrameProxy(self.conn, fid) info = None # XXX for now self.gui.interaction(message, frame, info) @@ -272,16 +275,23 @@ class IdbProxy: self.call("set_quit") def start_remote_debugger(conn, pyshell): - # - # instruct the (remote) subprocess to create - # a debugger instance, and lets it know that - # the local GUIAdapter called "gui_adapter" - # is waiting notification of debugging events - # - ada_oid = "gui_adapter" - idb_oid = conn.remotecall("exec", "start_debugger", (ada_oid,), {}) - idb = IdbProxy(conn, idb_oid) - gui = Debugger.Debugger(pyshell, idb) - ada = GUIAdaper(conn, gui) - conn.register(ada_oid, ada) + """Start the subprocess debugger, initialize the debugger GUI and RPC link + + Start the debugger in the remote Python process. Instantiate IdbProxy, + Debugger GUI, and Debugger GUIAdapter objects, and link them together. + + The GUIAdapter will handle debugger GUI interaction requests coming from + the subprocess debugger via the GUIProxy. + + The IdbAdapter will pass execution and environment requests coming from the + Idle debugger GUI to the subprocess debugger via the IdbProxy. + + """ + gui_adap_oid = "gui_adapter" + idb_adap_oid = conn.remotecall("exec", "start_the_debugger",\ + (gui_adap_oid,), {}) + idb_proxy = IdbProxy(conn, idb_adap_oid) + gui = Debugger.Debugger(pyshell, idb_proxy) + gui_adap = GUIAdapter(conn, gui) + conn.register(gui_adap_oid, gui_adap) return gui diff --git a/Lib/idlelib/rpc.py b/Lib/idlelib/rpc.py index a4d2705..35a2678 100644 --- a/Lib/idlelib/rpc.py +++ b/Lib/idlelib/rpc.py @@ -119,7 +119,7 @@ class SocketIO: pass def localcall(self, request): - ##self.debug("localcall:", request) + self.debug("localcall:", request) try: how, (oid, methodname, args, kwargs) = request except TypeError: @@ -165,6 +165,7 @@ class SocketIO: return ("EXCEPTION", (mod, name, args, tb)) def remotecall(self, oid, methodname, args, kwargs): + self.debug("remotecall:", oid, methodname, args, kwargs) seq = self.asynccall(oid, methodname, args, kwargs) return self.asyncreturn(seq) @@ -197,10 +198,12 @@ class SocketIO: pass else: raise getattr(__import__(mod), name)(*args) - else: - if mod: - name = mod + "." + name - raise name, args +# XXX KBK 15Jun02 mod is False here, also want to raise remaining exceptions +# else: +# if mod: +# name = mod + "." + name +# raise name, args + raise name, args if how == "ERROR": raise RuntimeError, what raise SystemError, (how, what) diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py index 1b84d4d..cfb318c 100644 --- a/Lib/idlelib/run.py +++ b/Lib/idlelib/run.py @@ -30,9 +30,9 @@ class Executive: def runcode(self, code): exec code in self.locals - def start_debugger(self, gui_oid): + def start_the_debugger(self, gui_adap_oid): import RemoteDebugger - return RemoteDebugger.start_debugger(self.conn, gui_oid) + return RemoteDebugger.start_debugger(self.conn, gui_adap_oid) def stackviewer(self, flist_oid=None): if not hasattr(sys, "last_traceback"): |