blob: f394bacd73e9d78ef875a10df11ba04ca0d238bb [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
Tony Lowndsf53dec22002-12-20 04:24:43 +00005import boolcheck
6
Kurt B. Kaiser5afa1df2002-10-10 08:25:24 +00007import CallTips
8import RemoteDebugger
9import RemoteObjectBrowser
10import StackViewer
Chui Tey5d2af632002-05-26 13:36:41 +000011import rpc
12
Kurt B. Kaiser5afa1df2002-10-10 08:25:24 +000013import __main__
14
Chui Tey5d2af632002-05-26 13:36:41 +000015def main():
Kurt B. Kaiserb4179362002-07-26 00:06:42 +000016 """Start the Python execution server in a subprocess
17
Kurt B. Kaiser5afa1df2002-10-10 08:25:24 +000018 In the Python subprocess, RPCServer is instantiated with handlerclass
19 MyHandler, which inherits register/unregister methods from RPCHandler via
20 the mix-in class SocketIO.
Kurt B. Kaiserb4179362002-07-26 00:06:42 +000021
Kurt B. Kaiser5afa1df2002-10-10 08:25:24 +000022 When the RPCServer svr is instantiated, the TCPServer initialization
23 creates an instance of run.MyHandler and calls its handle() method.
24 handle() instantiates a run.Executive object, passing it a reference to the
25 MyHandler object. That reference is saved as attribute rpchandler of the
26 Executive instance. The Executive methods have access to the reference and
27 can pass it on to entities that they command
28 (e.g. RemoteDebugger.Debugger.start_debugger()). The latter, in turn, can
29 call MyHandler(SocketIO) register/unregister methods via the reference to
30 register and unregister themselves.
Kurt B. Kaiserb4179362002-07-26 00:06:42 +000031
32 """
Chui Tey5d2af632002-05-26 13:36:41 +000033 port = 8833
34 if sys.argv[1:]:
35 port = int(sys.argv[1])
36 sys.argv[:] = [""]
37 addr = ("localhost", port)
Kurt B. Kaiser8dcdb772002-08-05 03:52:10 +000038 for i in range(6):
Kurt B. Kaiserb4179362002-07-26 00:06:42 +000039 time.sleep(i)
40 try:
41 svr = rpc.RPCServer(addr, MyHandler)
42 break
43 except socket.error, err:
Kurt B. Kaiser8dcdb772002-08-05 03:52:10 +000044 if i < 3:
Kurt B. Kaiserb4179362002-07-26 00:06:42 +000045 print>>sys.__stderr__, ".. ",
46 else:
47 print>>sys.__stderr__,"\nPython subprocess socket error: "\
48 + err[1] + ", retrying...."
49 else:
50 print>>sys.__stderr__, "\nConnection to Idle failed, exiting."
51 sys.exit()
Chui Tey5d2af632002-05-26 13:36:41 +000052 svr.handle_request() # A single request only
53
54class MyHandler(rpc.RPCHandler):
55
56 def handle(self):
57 executive = Executive(self)
58 self.register("exec", executive)
59 sys.stdin = self.get_remote_proxy("stdin")
60 sys.stdout = self.get_remote_proxy("stdout")
61 sys.stderr = self.get_remote_proxy("stderr")
62 rpc.RPCHandler.handle(self)
63
64class Executive:
65
66 def __init__(self, rpchandler):
Kurt B. Kaiserffd3a422002-06-26 02:32:09 +000067 self.rpchandler = rpchandler
Kurt B. Kaiseradc63842002-08-25 14:08:07 +000068 self.locals = __main__.__dict__
Kurt B. Kaiser5afa1df2002-10-10 08:25:24 +000069 self.calltip = CallTips.CallTips()
Chui Tey5d2af632002-05-26 13:36:41 +000070
71 def runcode(self, code):
Kurt B. Kaiseradc63842002-08-25 14:08:07 +000072 exec code in self.locals
Chui Tey5d2af632002-05-26 13:36:41 +000073
Kurt B. Kaiser0e3a5772002-06-16 03:32:24 +000074 def start_the_debugger(self, gui_adap_oid):
Kurt B. Kaiserffd3a422002-06-26 02:32:09 +000075 return RemoteDebugger.start_debugger(self.rpchandler, gui_adap_oid)
76
77 def stop_the_debugger(self, idb_adap_oid):
78 "Unregister the Idb Adapter. Link objects and Idb then subject to GC"
79 self.rpchandler.unregister(idb_adap_oid)
Chui Tey5d2af632002-05-26 13:36:41 +000080
Kurt B. Kaiser5afa1df2002-10-10 08:25:24 +000081 def get_the_calltip(self, name):
82 return self.calltip.fetch_tip(name)
83
Chui Tey5d2af632002-05-26 13:36:41 +000084 def stackviewer(self, flist_oid=None):
85 if not hasattr(sys, "last_traceback"):
86 return None
87 flist = None
88 if flist_oid is not None:
Kurt B. Kaiserffd3a422002-06-26 02:32:09 +000089 flist = self.rpchandler.get_remote_proxy(flist_oid)
Chui Tey5d2af632002-05-26 13:36:41 +000090 tb = sys.last_traceback
91 while tb and tb.tb_frame.f_globals["__name__"] in ["rpc", "run"]:
92 tb = tb.tb_next
93 item = StackViewer.StackTreeItem(flist, tb)
94 return RemoteObjectBrowser.remote_object_tree_item(item)