blob: 5b9864c8c57bd67e762d726c4e077bb9f50065ef [file] [log] [blame]
Chui Tey5d2af632002-05-26 13:36:41 +00001import sys
Kurt B. Kaiserb4179362002-07-26 00:06:42 +00002import time
3import socket
Kurt B. Kaiser5afa1df2002-10-10 08:25:24 +00004
5import CallTips
6import RemoteDebugger
7import RemoteObjectBrowser
8import StackViewer
Chui Tey5d2af632002-05-26 13:36:41 +00009import rpc
10
Kurt B. Kaiser5afa1df2002-10-10 08:25:24 +000011import __main__
12
Chui Tey5d2af632002-05-26 13:36:41 +000013def main():
Kurt B. Kaiserb4179362002-07-26 00:06:42 +000014 """Start the Python execution server in a subprocess
15
Kurt B. Kaiser5afa1df2002-10-10 08:25:24 +000016 In the Python subprocess, RPCServer is instantiated with handlerclass
17 MyHandler, which inherits register/unregister methods from RPCHandler via
18 the mix-in class SocketIO.
Kurt B. Kaiserb4179362002-07-26 00:06:42 +000019
Kurt B. Kaiser5afa1df2002-10-10 08:25:24 +000020 When the RPCServer svr is instantiated, the TCPServer initialization
21 creates an instance of run.MyHandler and calls its handle() method.
22 handle() instantiates a run.Executive object, passing it a reference to the
23 MyHandler object. That reference is saved as attribute rpchandler of the
24 Executive instance. The Executive methods have access to the reference and
25 can pass it on to entities that they command
26 (e.g. RemoteDebugger.Debugger.start_debugger()). The latter, in turn, can
27 call MyHandler(SocketIO) register/unregister methods via the reference to
28 register and unregister themselves.
Kurt B. Kaiserb4179362002-07-26 00:06:42 +000029
30 """
Chui Tey5d2af632002-05-26 13:36:41 +000031 port = 8833
32 if sys.argv[1:]:
33 port = int(sys.argv[1])
34 sys.argv[:] = [""]
35 addr = ("localhost", port)
Kurt B. Kaiser8dcdb772002-08-05 03:52:10 +000036 for i in range(6):
Kurt B. Kaiserb4179362002-07-26 00:06:42 +000037 time.sleep(i)
38 try:
39 svr = rpc.RPCServer(addr, MyHandler)
40 break
41 except socket.error, err:
Kurt B. Kaiser8dcdb772002-08-05 03:52:10 +000042 if i < 3:
Kurt B. Kaiserb4179362002-07-26 00:06:42 +000043 print>>sys.__stderr__, ".. ",
44 else:
45 print>>sys.__stderr__,"\nPython subprocess socket error: "\
46 + err[1] + ", retrying...."
47 else:
48 print>>sys.__stderr__, "\nConnection to Idle failed, exiting."
49 sys.exit()
Chui Tey5d2af632002-05-26 13:36:41 +000050 svr.handle_request() # A single request only
51
52class MyHandler(rpc.RPCHandler):
53
54 def handle(self):
55 executive = Executive(self)
56 self.register("exec", executive)
57 sys.stdin = self.get_remote_proxy("stdin")
58 sys.stdout = self.get_remote_proxy("stdout")
59 sys.stderr = self.get_remote_proxy("stderr")
60 rpc.RPCHandler.handle(self)
61
62class Executive:
63
64 def __init__(self, rpchandler):
Kurt B. Kaiserffd3a422002-06-26 02:32:09 +000065 self.rpchandler = rpchandler
Kurt B. Kaiseradc63842002-08-25 14:08:07 +000066 self.locals = __main__.__dict__
Kurt B. Kaiser5afa1df2002-10-10 08:25:24 +000067 self.calltip = CallTips.CallTips()
Chui Tey5d2af632002-05-26 13:36:41 +000068
69 def runcode(self, code):
Kurt B. Kaiseradc63842002-08-25 14:08:07 +000070 exec code in self.locals
Chui Tey5d2af632002-05-26 13:36:41 +000071
Kurt B. Kaiser0e3a5772002-06-16 03:32:24 +000072 def start_the_debugger(self, gui_adap_oid):
Kurt B. Kaiserffd3a422002-06-26 02:32:09 +000073 return RemoteDebugger.start_debugger(self.rpchandler, gui_adap_oid)
74
75 def stop_the_debugger(self, idb_adap_oid):
76 "Unregister the Idb Adapter. Link objects and Idb then subject to GC"
77 self.rpchandler.unregister(idb_adap_oid)
Chui Tey5d2af632002-05-26 13:36:41 +000078
Kurt B. Kaiser5afa1df2002-10-10 08:25:24 +000079 def get_the_calltip(self, name):
80 return self.calltip.fetch_tip(name)
81
Chui Tey5d2af632002-05-26 13:36:41 +000082 def stackviewer(self, flist_oid=None):
83 if not hasattr(sys, "last_traceback"):
84 return None
85 flist = None
86 if flist_oid is not None:
Kurt B. Kaiserffd3a422002-06-26 02:32:09 +000087 flist = self.rpchandler.get_remote_proxy(flist_oid)
Chui Tey5d2af632002-05-26 13:36:41 +000088 tb = sys.last_traceback
89 while tb and tb.tb_frame.f_globals["__name__"] in ["rpc", "run"]:
90 tb = tb.tb_next
91 item = StackViewer.StackTreeItem(flist, tb)
92 return RemoteObjectBrowser.remote_object_tree_item(item)