blob: 5b3c733e3daaeff13337aa77df27fe98346dc049 [file] [log] [blame]
Chui Tey5d2af632002-05-26 13:36:41 +00001import sys
Kurt B. Kaiserb4179362002-07-26 00:06:42 +00002import time
3import socket
Chui Tey5d2af632002-05-26 13:36:41 +00004import rpc
5
6def main():
Kurt B. Kaiserb4179362002-07-26 00:06:42 +00007 """Start the Python execution server in a subprocess
8
9 In Idle, RPCServer is instantiated with handlerclass MyHandler, which
10 inherits register/unregister methods from RPCHandler via the mix-in class
11 SocketIO.
12
13 When the RPCServer is instantiated, the TCPServer initialization creates an
14 instance of run.MyHandler and calls its handle() method. handle()
15 instantiates a run.Executive, passing it a reference to the MyHandler
16 object. That reference is saved as an attribute of the Executive instance.
17 The Executive methods have access to the reference and can pass it on to
18 entities that they command (e.g. RemoteDebugger.Debugger.start_debugger()).
19 The latter, in turn, can call MyHandler(SocketIO) register/unregister
20 methods via the reference to register and unregister themselves.
21
22 """
Chui Tey5d2af632002-05-26 13:36:41 +000023 port = 8833
24 if sys.argv[1:]:
25 port = int(sys.argv[1])
26 sys.argv[:] = [""]
27 addr = ("localhost", port)
Kurt B. Kaiser8dcdb772002-08-05 03:52:10 +000028 for i in range(6):
Kurt B. Kaiserb4179362002-07-26 00:06:42 +000029 time.sleep(i)
30 try:
31 svr = rpc.RPCServer(addr, MyHandler)
32 break
33 except socket.error, err:
Kurt B. Kaiser8dcdb772002-08-05 03:52:10 +000034 if i < 3:
Kurt B. Kaiserb4179362002-07-26 00:06:42 +000035 print>>sys.__stderr__, ".. ",
36 else:
37 print>>sys.__stderr__,"\nPython subprocess socket error: "\
38 + err[1] + ", retrying...."
39 else:
40 print>>sys.__stderr__, "\nConnection to Idle failed, exiting."
41 sys.exit()
Chui Tey5d2af632002-05-26 13:36:41 +000042 svr.handle_request() # A single request only
43
44class MyHandler(rpc.RPCHandler):
45
46 def handle(self):
47 executive = Executive(self)
48 self.register("exec", executive)
49 sys.stdin = self.get_remote_proxy("stdin")
50 sys.stdout = self.get_remote_proxy("stdout")
51 sys.stderr = self.get_remote_proxy("stderr")
52 rpc.RPCHandler.handle(self)
53
54class Executive:
55
56 def __init__(self, rpchandler):
Kurt B. Kaiserffd3a422002-06-26 02:32:09 +000057 self.rpchandler = rpchandler
Kurt B. Kaiseradc63842002-08-25 14:08:07 +000058 import __main__
59 self.locals = __main__.__dict__
Chui Tey5d2af632002-05-26 13:36:41 +000060
61 def runcode(self, code):
Kurt B. Kaiseradc63842002-08-25 14:08:07 +000062 exec code in self.locals
Chui Tey5d2af632002-05-26 13:36:41 +000063
Kurt B. Kaiser0e3a5772002-06-16 03:32:24 +000064 def start_the_debugger(self, gui_adap_oid):
Chui Tey5d2af632002-05-26 13:36:41 +000065 import RemoteDebugger
Kurt B. Kaiserffd3a422002-06-26 02:32:09 +000066 return RemoteDebugger.start_debugger(self.rpchandler, gui_adap_oid)
67
68 def stop_the_debugger(self, idb_adap_oid):
69 "Unregister the Idb Adapter. Link objects and Idb then subject to GC"
70 self.rpchandler.unregister(idb_adap_oid)
Chui Tey5d2af632002-05-26 13:36:41 +000071
72 def stackviewer(self, flist_oid=None):
73 if not hasattr(sys, "last_traceback"):
74 return None
75 flist = None
76 if flist_oid is not None:
Kurt B. Kaiserffd3a422002-06-26 02:32:09 +000077 flist = self.rpchandler.get_remote_proxy(flist_oid)
Chui Tey5d2af632002-05-26 13:36:41 +000078 import RemoteObjectBrowser
79 import StackViewer
80 tb = sys.last_traceback
81 while tb and tb.tb_frame.f_globals["__name__"] in ["rpc", "run"]:
82 tb = tb.tb_next
83 item = StackViewer.StackTreeItem(flist, tb)
84 return RemoteObjectBrowser.remote_object_tree_item(item)