| 
									
										
										
										
											2002-05-26 13:36:41 +00:00
										 |  |  | import sys | 
					
						
							| 
									
										
										
										
											2004-07-04 01:25:56 +00:00
										 |  |  | import linecache | 
					
						
							| 
									
										
										
										
											2002-07-26 00:06:42 +00:00
										 |  |  | import time | 
					
						
							|  |  |  | import socket | 
					
						
							| 
									
										
										
										
											2003-02-27 23:04:17 +00:00
										 |  |  | import traceback | 
					
						
							| 
									
										
										
										
											2003-06-13 22:03:43 +00:00
										 |  |  | import thread | 
					
						
							| 
									
										
										
										
											2003-03-22 19:40:19 +00:00
										 |  |  | import threading | 
					
						
							|  |  |  | import Queue | 
					
						
							| 
									
										
										
										
											2002-10-10 08:25:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | import CallTips | 
					
						
							| 
									
										
										
										
											2005-11-18 22:05:48 +00:00
										 |  |  | import AutoComplete | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-10 08:25:24 +00:00
										 |  |  | import RemoteDebugger | 
					
						
							|  |  |  | import RemoteObjectBrowser | 
					
						
							|  |  |  | import StackViewer | 
					
						
							| 
									
										
										
										
											2002-05-26 13:36:41 +00:00
										 |  |  | import rpc | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-10 08:25:24 +00:00
										 |  |  | import __main__ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-06-05 23:51:29 +00:00
										 |  |  | LOCALHOST = '127.0.0.1' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-07-04 01:25:56 +00:00
										 |  |  | try: | 
					
						
							|  |  |  |     import warnings | 
					
						
							|  |  |  | except ImportError: | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | else: | 
					
						
							|  |  |  |     def idle_formatwarning_subproc(message, category, filename, lineno): | 
					
						
							|  |  |  |         """Format warnings the IDLE way""" | 
					
						
							|  |  |  |         s = "\nWarning (from warnings module):\n" | 
					
						
							|  |  |  |         s += '  File \"%s\", line %s\n' % (filename, lineno) | 
					
						
							|  |  |  |         line = linecache.getline(filename, lineno).strip() | 
					
						
							|  |  |  |         if line: | 
					
						
							|  |  |  |             s += "    %s\n" % line | 
					
						
							|  |  |  |         s += "%s: %s\n" % (category.__name__, message) | 
					
						
							|  |  |  |         return s | 
					
						
							|  |  |  |     warnings.formatwarning = idle_formatwarning_subproc | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-03-22 19:40:19 +00:00
										 |  |  | # Thread shared globals: Establish a queue between a subthread (which handles | 
					
						
							|  |  |  | # the socket) and the main thread (which runs user code), plus global | 
					
						
							| 
									
										
										
										
											2007-10-09 19:31:30 +00:00
										 |  |  | # completion, exit and interruptable (the main thread) flags: | 
					
						
							| 
									
										
										
										
											2003-03-22 19:40:19 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-05-24 20:59:15 +00:00
										 |  |  | exit_now = False | 
					
						
							|  |  |  | quitting = False | 
					
						
							| 
									
										
										
										
											2007-10-09 19:31:30 +00:00
										 |  |  | interruptable = False | 
					
						
							| 
									
										
										
										
											2003-03-22 19:40:19 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-05-28 01:47:46 +00:00
										 |  |  | def main(del_exitfunc=False): | 
					
						
							| 
									
										
										
										
											2002-07-26 00:06:42 +00:00
										 |  |  |     """Start the Python execution server in a subprocess
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-10 08:25:24 +00:00
										 |  |  |     In the Python subprocess, RPCServer is instantiated with handlerclass | 
					
						
							|  |  |  |     MyHandler, which inherits register/unregister methods from RPCHandler via | 
					
						
							|  |  |  |     the mix-in class SocketIO. | 
					
						
							| 
									
										
										
										
											2002-07-26 00:06:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-03-22 19:40:19 +00:00
										 |  |  |     When the RPCServer 'server' is instantiated, the TCPServer initialization | 
					
						
							| 
									
										
										
										
											2002-10-10 08:25:24 +00:00
										 |  |  |     creates an instance of run.MyHandler and calls its handle() method. | 
					
						
							|  |  |  |     handle() instantiates a run.Executive object, passing it a reference to the | 
					
						
							|  |  |  |     MyHandler object.  That reference is saved as attribute rpchandler of the | 
					
						
							|  |  |  |     Executive instance.  The Executive methods have access to the reference and | 
					
						
							|  |  |  |     can pass it on to entities that they command | 
					
						
							|  |  |  |     (e.g. RemoteDebugger.Debugger.start_debugger()).  The latter, in turn, can | 
					
						
							|  |  |  |     call MyHandler(SocketIO) register/unregister methods via the reference to | 
					
						
							|  |  |  |     register and unregister themselves. | 
					
						
							| 
									
										
										
										
											2002-07-26 00:06:42 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2003-05-24 20:59:15 +00:00
										 |  |  |     global exit_now | 
					
						
							|  |  |  |     global quitting | 
					
						
							| 
									
										
										
										
											2003-05-28 01:47:46 +00:00
										 |  |  |     global no_exitfunc | 
					
						
							|  |  |  |     no_exitfunc = del_exitfunc | 
					
						
							| 
									
										
										
										
											2002-05-26 13:36:41 +00:00
										 |  |  |     port = 8833 | 
					
						
							| 
									
										
										
										
											2004-01-21 18:54:30 +00:00
										 |  |  |     #time.sleep(15) # test subprocess not responding | 
					
						
							| 
									
										
										
										
											2002-05-26 13:36:41 +00:00
										 |  |  |     if sys.argv[1:]: | 
					
						
							|  |  |  |         port = int(sys.argv[1]) | 
					
						
							|  |  |  |     sys.argv[:] = [""] | 
					
						
							| 
									
										
										
										
											2003-03-22 19:40:19 +00:00
										 |  |  |     sockthread = threading.Thread(target=manage_socket, | 
					
						
							|  |  |  |                                   name='SockThread', | 
					
						
							| 
									
										
										
										
											2003-06-05 23:51:29 +00:00
										 |  |  |                                   args=((LOCALHOST, port),)) | 
					
						
							| 
									
										
										
										
											2003-03-22 19:40:19 +00:00
										 |  |  |     sockthread.setDaemon(True) | 
					
						
							|  |  |  |     sockthread.start() | 
					
						
							|  |  |  |     while 1: | 
					
						
							|  |  |  |         try: | 
					
						
							| 
									
										
										
										
											2003-05-24 20:59:15 +00:00
										 |  |  |             if exit_now: | 
					
						
							|  |  |  |                 try: | 
					
						
							| 
									
										
										
										
											2003-05-28 01:47:46 +00:00
										 |  |  |                     exit() | 
					
						
							| 
									
										
										
										
											2003-05-24 20:59:15 +00:00
										 |  |  |                 except KeyboardInterrupt: | 
					
						
							|  |  |  |                     # exiting but got an extra KBI? Try again! | 
					
						
							|  |  |  |                     continue | 
					
						
							| 
									
										
										
										
											2003-05-08 20:26:55 +00:00
										 |  |  |             try: | 
					
						
							| 
									
										
										
										
											2005-05-05 23:29:54 +00:00
										 |  |  |                 seq, request = rpc.request_queue.get(block=True, timeout=0.05) | 
					
						
							| 
									
										
										
										
											2003-05-08 20:26:55 +00:00
										 |  |  |             except Queue.Empty: | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             method, args, kwargs = request | 
					
						
							|  |  |  |             ret = method(*args, **kwargs) | 
					
						
							|  |  |  |             rpc.response_queue.put((seq, ret)) | 
					
						
							| 
									
										
										
										
											2003-05-14 18:15:40 +00:00
										 |  |  |         except KeyboardInterrupt: | 
					
						
							| 
									
										
										
										
											2003-05-24 20:59:15 +00:00
										 |  |  |             if quitting: | 
					
						
							|  |  |  |                 exit_now = True | 
					
						
							| 
									
										
										
										
											2003-05-14 18:15:40 +00:00
										 |  |  |             continue | 
					
						
							| 
									
										
										
										
											2003-05-17 21:04:10 +00:00
										 |  |  |         except SystemExit: | 
					
						
							|  |  |  |             raise | 
					
						
							| 
									
										
										
										
											2003-05-12 02:33:47 +00:00
										 |  |  |         except: | 
					
						
							| 
									
										
										
										
											2003-05-24 20:59:15 +00:00
										 |  |  |             type, value, tb = sys.exc_info() | 
					
						
							| 
									
										
										
										
											2003-05-17 21:04:10 +00:00
										 |  |  |             try: | 
					
						
							|  |  |  |                 print_exception() | 
					
						
							|  |  |  |                 rpc.response_queue.put((seq, None)) | 
					
						
							|  |  |  |             except: | 
					
						
							| 
									
										
										
										
											2003-05-24 20:59:15 +00:00
										 |  |  |                 # Link didn't work, print same exception to __stderr__ | 
					
						
							|  |  |  |                 traceback.print_exception(type, value, tb, file=sys.__stderr__) | 
					
						
							| 
									
										
										
										
											2003-05-28 01:47:46 +00:00
										 |  |  |                 exit() | 
					
						
							| 
									
										
										
										
											2003-05-24 20:59:15 +00:00
										 |  |  |             else: | 
					
						
							|  |  |  |                 continue | 
					
						
							| 
									
										
										
										
											2003-03-22 19:40:19 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def manage_socket(address): | 
					
						
							| 
									
										
										
										
											2004-01-21 18:54:30 +00:00
										 |  |  |     for i in range(3): | 
					
						
							| 
									
										
										
										
											2002-07-26 00:06:42 +00:00
										 |  |  |         time.sleep(i) | 
					
						
							|  |  |  |         try: | 
					
						
							| 
									
										
										
										
											2003-05-08 20:26:55 +00:00
										 |  |  |             server = MyRPCServer(address, MyHandler) | 
					
						
							| 
									
										
										
										
											2002-07-26 00:06:42 +00:00
										 |  |  |             break | 
					
						
							|  |  |  |         except socket.error, err: | 
					
						
							| 
									
										
										
										
											2004-01-21 18:54:30 +00:00
										 |  |  |             print>>sys.__stderr__,"IDLE Subprocess: socket error: "\ | 
					
						
							|  |  |  |                                         + err[1] + ", retrying...." | 
					
						
							| 
									
										
										
										
											2002-07-26 00:06:42 +00:00
										 |  |  |     else: | 
					
						
							| 
									
										
										
										
											2004-01-21 18:54:30 +00:00
										 |  |  |         print>>sys.__stderr__, "IDLE Subprocess: Connection to "\ | 
					
						
							|  |  |  |                                "IDLE GUI failed, exiting." | 
					
						
							|  |  |  |         show_socket_error(err, address) | 
					
						
							| 
									
										
										
										
											2003-05-24 20:59:15 +00:00
										 |  |  |         global exit_now | 
					
						
							|  |  |  |         exit_now = True | 
					
						
							| 
									
										
										
										
											2003-05-08 20:26:55 +00:00
										 |  |  |         return | 
					
						
							| 
									
										
										
										
											2003-03-22 19:40:19 +00:00
										 |  |  |     server.handle_request() # A single request only | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-01-21 18:54:30 +00:00
										 |  |  | def show_socket_error(err, address): | 
					
						
							|  |  |  |     import Tkinter | 
					
						
							|  |  |  |     import tkMessageBox | 
					
						
							|  |  |  |     root = Tkinter.Tk() | 
					
						
							|  |  |  |     root.withdraw() | 
					
						
							|  |  |  |     if err[0] == 61: # connection refused | 
					
						
							|  |  |  |         msg = "IDLE's subprocess can't connect to %s:%d.  This may be due "\ | 
					
						
							|  |  |  |               "to your personal firewall configuration.  It is safe to "\ | 
					
						
							|  |  |  |               "allow this internal connection because no data is visible on "\ | 
					
						
							|  |  |  |               "external ports." % address | 
					
						
							|  |  |  |         tkMessageBox.showerror("IDLE Subprocess Error", msg, parent=root) | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         tkMessageBox.showerror("IDLE Subprocess Error", "Socket Error: %s" % err[1]) | 
					
						
							|  |  |  |     root.destroy() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-05-12 02:33:47 +00:00
										 |  |  | def print_exception(): | 
					
						
							| 
									
										
										
										
											2004-01-02 04:04:04 +00:00
										 |  |  |     import linecache | 
					
						
							|  |  |  |     linecache.checkcache() | 
					
						
							| 
									
										
										
										
											2003-05-12 02:33:47 +00:00
										 |  |  |     flush_stdout() | 
					
						
							|  |  |  |     efile = sys.stderr | 
					
						
							| 
									
										
										
										
											2003-11-19 04:52:32 +00:00
										 |  |  |     typ, val, tb = excinfo = sys.exc_info() | 
					
						
							|  |  |  |     sys.last_type, sys.last_value, sys.last_traceback = excinfo | 
					
						
							| 
									
										
										
										
											2003-05-12 02:33:47 +00:00
										 |  |  |     tbe = traceback.extract_tb(tb) | 
					
						
							| 
									
										
										
										
											2004-01-21 18:54:30 +00:00
										 |  |  |     print>>efile, '\nTraceback (most recent call last):' | 
					
						
							| 
									
										
										
										
											2003-05-12 02:33:47 +00:00
										 |  |  |     exclude = ("run.py", "rpc.py", "threading.py", "Queue.py", | 
					
						
							|  |  |  |                "RemoteDebugger.py", "bdb.py") | 
					
						
							|  |  |  |     cleanup_traceback(tbe, exclude) | 
					
						
							|  |  |  |     traceback.print_list(tbe, file=efile) | 
					
						
							|  |  |  |     lines = traceback.format_exception_only(typ, val) | 
					
						
							|  |  |  |     for line in lines: | 
					
						
							|  |  |  |         print>>efile, line, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def cleanup_traceback(tb, exclude): | 
					
						
							|  |  |  |     "Remove excluded traces from beginning/end of tb; get cached lines" | 
					
						
							|  |  |  |     orig_tb = tb[:] | 
					
						
							|  |  |  |     while tb: | 
					
						
							|  |  |  |         for rpcfile in exclude: | 
					
						
							|  |  |  |             if tb[0][0].count(rpcfile): | 
					
						
							|  |  |  |                 break    # found an exclude, break for: and delete tb[0] | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             break        # no excludes, have left RPC code, break while: | 
					
						
							|  |  |  |         del tb[0] | 
					
						
							|  |  |  |     while tb: | 
					
						
							|  |  |  |         for rpcfile in exclude: | 
					
						
							|  |  |  |             if tb[-1][0].count(rpcfile): | 
					
						
							|  |  |  |                 break | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             break | 
					
						
							|  |  |  |         del tb[-1] | 
					
						
							|  |  |  |     if len(tb) == 0: | 
					
						
							|  |  |  |         # exception was in IDLE internals, don't prune! | 
					
						
							|  |  |  |         tb[:] = orig_tb[:] | 
					
						
							|  |  |  |         print>>sys.stderr, "** IDLE Internal Exception: " | 
					
						
							|  |  |  |     rpchandler = rpc.objecttable['exec'].rpchandler | 
					
						
							|  |  |  |     for i in range(len(tb)): | 
					
						
							|  |  |  |         fn, ln, nm, line = tb[i] | 
					
						
							|  |  |  |         if nm == '?': | 
					
						
							|  |  |  |             nm = "-toplevel-" | 
					
						
							|  |  |  |         if not line and fn.startswith("<pyshell#"): | 
					
						
							|  |  |  |             line = rpchandler.remotecall('linecache', 'getline', | 
					
						
							|  |  |  |                                               (fn, ln), {}) | 
					
						
							|  |  |  |         tb[i] = fn, ln, nm, line | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def flush_stdout(): | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         if sys.stdout.softspace: | 
					
						
							|  |  |  |             sys.stdout.softspace = 0 | 
					
						
							|  |  |  |             sys.stdout.write("\n") | 
					
						
							|  |  |  |     except (AttributeError, EOFError): | 
					
						
							|  |  |  |         pass | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-05-28 01:47:46 +00:00
										 |  |  | def exit(): | 
					
						
							|  |  |  |     """Exit subprocess, possibly after first deleting sys.exitfunc
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     If config-main.cfg/.def 'General' 'delete-exitfunc' is True, then any | 
					
						
							|  |  |  |     sys.exitfunc will be removed before exiting.  (VPython support) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     if no_exitfunc: | 
					
						
							| 
									
										
										
										
											2008-01-23 22:55:26 +00:00
										 |  |  |         try: | 
					
						
							|  |  |  |             del sys.exitfunc | 
					
						
							|  |  |  |         except AttributeError: | 
					
						
							|  |  |  |             pass | 
					
						
							| 
									
										
										
										
											2003-05-28 01:47:46 +00:00
										 |  |  |     sys.exit(0) | 
					
						
							| 
									
										
										
										
											2002-05-26 13:36:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-05-08 20:26:55 +00:00
										 |  |  | class MyRPCServer(rpc.RPCServer): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def handle_error(self, request, client_address): | 
					
						
							|  |  |  |         """Override RPCServer method for IDLE
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Interrupt the MainThread and exit server if link is dropped. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2004-11-19 15:46:49 +00:00
										 |  |  |         global quitting | 
					
						
							| 
									
										
										
										
											2003-05-08 20:26:55 +00:00
										 |  |  |         try: | 
					
						
							|  |  |  |             raise | 
					
						
							|  |  |  |         except SystemExit: | 
					
						
							|  |  |  |             raise | 
					
						
							|  |  |  |         except EOFError: | 
					
						
							| 
									
										
										
										
											2003-05-24 20:59:15 +00:00
										 |  |  |             global exit_now | 
					
						
							|  |  |  |             exit_now = True | 
					
						
							| 
									
										
										
										
											2003-06-13 22:03:43 +00:00
										 |  |  |             thread.interrupt_main() | 
					
						
							| 
									
										
										
										
											2003-05-08 20:26:55 +00:00
										 |  |  |         except: | 
					
						
							|  |  |  |             erf = sys.__stderr__ | 
					
						
							|  |  |  |             print>>erf, '\n' + '-'*40 | 
					
						
							|  |  |  |             print>>erf, 'Unhandled server exception!' | 
					
						
							|  |  |  |             print>>erf, 'Thread: %s' % threading.currentThread().getName() | 
					
						
							|  |  |  |             print>>erf, 'Client Address: ', client_address | 
					
						
							|  |  |  |             print>>erf, 'Request: ', repr(request) | 
					
						
							|  |  |  |             traceback.print_exc(file=erf) | 
					
						
							|  |  |  |             print>>erf, '\n*** Unrecoverable, server exiting!' | 
					
						
							|  |  |  |             print>>erf, '-'*40 | 
					
						
							| 
									
										
										
										
											2004-11-19 15:46:49 +00:00
										 |  |  |             quitting = True | 
					
						
							|  |  |  |             thread.interrupt_main() | 
					
						
							| 
									
										
										
										
											2003-05-08 20:26:55 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-26 13:36:41 +00:00
										 |  |  | class MyHandler(rpc.RPCHandler): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def handle(self): | 
					
						
							| 
									
										
										
										
											2003-03-22 19:40:19 +00:00
										 |  |  |         """Override base method""" | 
					
						
							| 
									
										
										
										
											2002-05-26 13:36:41 +00:00
										 |  |  |         executive = Executive(self) | 
					
						
							|  |  |  |         self.register("exec", executive) | 
					
						
							| 
									
										
										
										
											2003-06-02 01:50:19 +00:00
										 |  |  |         sys.stdin = self.console = self.get_remote_proxy("stdin") | 
					
						
							| 
									
										
										
										
											2002-05-26 13:36:41 +00:00
										 |  |  |         sys.stdout = self.get_remote_proxy("stdout") | 
					
						
							|  |  |  |         sys.stderr = self.get_remote_proxy("stderr") | 
					
						
							| 
									
										
										
										
											2003-06-22 07:52:56 +00:00
										 |  |  |         import IOBinding | 
					
						
							|  |  |  |         sys.stdin.encoding = sys.stdout.encoding = \ | 
					
						
							|  |  |  |                              sys.stderr.encoding = IOBinding.encoding | 
					
						
							| 
									
										
										
										
											2003-06-02 01:50:19 +00:00
										 |  |  |         self.interp = self.get_remote_proxy("interp") | 
					
						
							| 
									
										
										
										
											2003-05-08 20:26:55 +00:00
										 |  |  |         rpc.RPCHandler.getresponse(self, myseq=None, wait=0.05) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def exithook(self): | 
					
						
							|  |  |  |         "override SocketIO method - wait for MainThread to shut us down" | 
					
						
							| 
									
										
										
										
											2003-05-24 20:59:15 +00:00
										 |  |  |         time.sleep(10) | 
					
						
							| 
									
										
										
										
											2003-05-08 20:26:55 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def EOFhook(self): | 
					
						
							|  |  |  |         "Override SocketIO method - terminate wait on callback and exit thread" | 
					
						
							| 
									
										
										
										
											2003-05-24 20:59:15 +00:00
										 |  |  |         global quitting | 
					
						
							|  |  |  |         quitting = True | 
					
						
							| 
									
										
										
										
											2003-06-13 22:03:43 +00:00
										 |  |  |         thread.interrupt_main() | 
					
						
							| 
									
										
										
										
											2003-05-08 20:26:55 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def decode_interrupthook(self): | 
					
						
							|  |  |  |         "interrupt awakened thread" | 
					
						
							| 
									
										
										
										
											2003-05-24 20:59:15 +00:00
										 |  |  |         global quitting | 
					
						
							|  |  |  |         quitting = True | 
					
						
							| 
									
										
										
										
											2003-06-13 22:03:43 +00:00
										 |  |  |         thread.interrupt_main() | 
					
						
							| 
									
										
										
										
											2003-03-22 19:40:19 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-26 13:36:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-12-21 22:10:32 +00:00
										 |  |  | class Executive(object): | 
					
						
							| 
									
										
										
										
											2002-05-26 13:36:41 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self, rpchandler): | 
					
						
							| 
									
										
										
										
											2002-06-26 02:32:09 +00:00
										 |  |  |         self.rpchandler = rpchandler | 
					
						
							| 
									
										
										
										
											2002-08-25 14:08:07 +00:00
										 |  |  |         self.locals = __main__.__dict__ | 
					
						
							| 
									
										
										
										
											2002-10-10 08:25:24 +00:00
										 |  |  |         self.calltip = CallTips.CallTips() | 
					
						
							| 
									
										
										
										
											2005-11-18 22:05:48 +00:00
										 |  |  |         self.autocomplete = AutoComplete.AutoComplete() | 
					
						
							| 
									
										
										
										
											2002-05-26 13:36:41 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def runcode(self, code): | 
					
						
							| 
									
										
										
										
											2007-10-09 19:31:30 +00:00
										 |  |  |         global interruptable | 
					
						
							| 
									
										
										
										
											2003-02-27 23:04:17 +00:00
										 |  |  |         try: | 
					
						
							| 
									
										
										
										
											2003-06-02 01:50:19 +00:00
										 |  |  |             self.usr_exc_info = None | 
					
						
							| 
									
										
										
										
											2007-10-09 19:31:30 +00:00
										 |  |  |             interruptable = True | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 exec code in self.locals | 
					
						
							|  |  |  |             finally: | 
					
						
							|  |  |  |                 interruptable = False | 
					
						
							| 
									
										
										
										
											2003-02-27 23:04:17 +00:00
										 |  |  |         except: | 
					
						
							| 
									
										
										
										
											2003-06-02 01:50:19 +00:00
										 |  |  |             self.usr_exc_info = sys.exc_info() | 
					
						
							| 
									
										
										
										
											2003-05-24 20:59:15 +00:00
										 |  |  |             if quitting: | 
					
						
							| 
									
										
										
										
											2003-05-28 01:47:46 +00:00
										 |  |  |                 exit() | 
					
						
							| 
									
										
										
										
											2003-05-24 20:59:15 +00:00
										 |  |  |             # even print a user code SystemExit exception, continue | 
					
						
							|  |  |  |             print_exception() | 
					
						
							| 
									
										
										
										
											2003-06-02 01:50:19 +00:00
										 |  |  |             jit = self.rpchandler.console.getvar("<<toggle-jit-stack-viewer>>") | 
					
						
							|  |  |  |             if jit: | 
					
						
							|  |  |  |                 self.rpchandler.interp.open_remote_stack_viewer() | 
					
						
							| 
									
										
										
										
											2003-03-22 19:40:19 +00:00
										 |  |  |         else: | 
					
						
							| 
									
										
										
										
											2003-05-12 02:33:47 +00:00
										 |  |  |             flush_stdout() | 
					
						
							| 
									
										
										
										
											2002-05-26 13:36:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-02-17 18:57:16 +00:00
										 |  |  |     def interrupt_the_server(self): | 
					
						
							| 
									
										
										
										
											2007-10-09 19:31:30 +00:00
										 |  |  |         if interruptable: | 
					
						
							|  |  |  |             thread.interrupt_main() | 
					
						
							| 
									
										
										
										
											2003-03-22 19:40:19 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-06-16 03:32:24 +00:00
										 |  |  |     def start_the_debugger(self, gui_adap_oid): | 
					
						
							| 
									
										
										
										
											2002-06-26 02:32:09 +00:00
										 |  |  |         return RemoteDebugger.start_debugger(self.rpchandler, gui_adap_oid) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def stop_the_debugger(self, idb_adap_oid): | 
					
						
							|  |  |  |         "Unregister the Idb Adapter.  Link objects and Idb then subject to GC" | 
					
						
							|  |  |  |         self.rpchandler.unregister(idb_adap_oid) | 
					
						
							| 
									
										
										
										
											2002-05-26 13:36:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-10 08:25:24 +00:00
										 |  |  |     def get_the_calltip(self, name): | 
					
						
							|  |  |  |         return self.calltip.fetch_tip(name) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-18 22:05:48 +00:00
										 |  |  |     def get_the_completion_list(self, what, mode): | 
					
						
							|  |  |  |         return self.autocomplete.fetch_completions(what, mode) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-05-26 13:36:41 +00:00
										 |  |  |     def stackviewer(self, flist_oid=None): | 
					
						
							| 
									
										
										
										
											2003-06-02 01:50:19 +00:00
										 |  |  |         if self.usr_exc_info: | 
					
						
							|  |  |  |             typ, val, tb = self.usr_exc_info | 
					
						
							|  |  |  |         else: | 
					
						
							| 
									
										
										
										
											2002-05-26 13:36:41 +00:00
										 |  |  |             return None | 
					
						
							|  |  |  |         flist = None | 
					
						
							|  |  |  |         if flist_oid is not None: | 
					
						
							| 
									
										
										
										
											2002-06-26 02:32:09 +00:00
										 |  |  |             flist = self.rpchandler.get_remote_proxy(flist_oid) | 
					
						
							| 
									
										
										
										
											2002-05-26 13:36:41 +00:00
										 |  |  |         while tb and tb.tb_frame.f_globals["__name__"] in ["rpc", "run"]: | 
					
						
							|  |  |  |             tb = tb.tb_next | 
					
						
							| 
									
										
										
										
											2003-06-02 01:50:19 +00:00
										 |  |  |         sys.last_type = typ | 
					
						
							|  |  |  |         sys.last_value = val | 
					
						
							| 
									
										
										
										
											2002-05-26 13:36:41 +00:00
										 |  |  |         item = StackViewer.StackTreeItem(flist, tb) | 
					
						
							|  |  |  |         return RemoteObjectBrowser.remote_object_tree_item(item) |