2002-05-26 21:36:41 +08:00
|
|
|
import sys
|
2003-05-09 04:26:55 +08:00
|
|
|
import os
|
2004-07-04 09:25:56 +08:00
|
|
|
import linecache
|
2002-07-26 08:06:42 +08:00
|
|
|
import time
|
|
|
|
import socket
|
2003-02-28 07:04:17 +08:00
|
|
|
import traceback
|
2003-06-14 06:03:43 +08:00
|
|
|
import thread
|
2003-03-23 03:40:19 +08:00
|
|
|
import threading
|
|
|
|
import Queue
|
2002-10-10 16:25:24 +08:00
|
|
|
|
Merged revisions 56443-56466 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/p3yk
................
r56454 | kurt.kaiser | 2007-07-18 22:26:14 -0700 (Wed, 18 Jul 2007) | 2 lines
Make relative imports explicit for py3k
................
r56455 | kurt.kaiser | 2007-07-18 23:12:15 -0700 (Wed, 18 Jul 2007) | 2 lines
Was modifying dict during iteration.
................
r56457 | guido.van.rossum | 2007-07-19 07:33:19 -0700 (Thu, 19 Jul 2007) | 2 lines
Fix failing test.
................
r56466 | guido.van.rossum | 2007-07-19 20:58:16 -0700 (Thu, 19 Jul 2007) | 35 lines
Merged revisions 56413-56465 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r56439 | georg.brandl | 2007-07-17 23:37:55 -0700 (Tue, 17 Jul 2007) | 2 lines
Use "Unix" as platform name, not "UNIX".
........
r56441 | guido.van.rossum | 2007-07-18 10:19:14 -0700 (Wed, 18 Jul 2007) | 3 lines
SF patch# 1755885 by Kurt Kaiser: show location of Unicode escape errors.
(Slightly tweaked for style and refcounts.)
........
r56444 | kurt.kaiser | 2007-07-18 12:58:42 -0700 (Wed, 18 Jul 2007) | 2 lines
Fix failing unicode test caused by change to ast.c at r56441
........
r56451 | georg.brandl | 2007-07-18 15:36:53 -0700 (Wed, 18 Jul 2007) | 2 lines
Add description for wave.setcomptype() values
........
r56456 | walter.doerwald | 2007-07-19 06:04:38 -0700 (Thu, 19 Jul 2007) | 3 lines
Document that codecs.lookup() returns a CodecInfo object.
(fixes SF bug #1754453).
........
r56463 | facundo.batista | 2007-07-19 16:57:38 -0700 (Thu, 19 Jul 2007) | 6 lines
Added a select.select call in the test server loop to make sure the
socket is ready to be read from before attempting a read (this
prevents an error 10035 on some Windows platforms). [GSoC - Alan
McIntyre]
........
................
2007-07-20 12:05:57 +08:00
|
|
|
from . import CallTips
|
|
|
|
from . import AutoComplete
|
2005-11-19 06:05:48 +08:00
|
|
|
|
Merged revisions 56443-56466 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/p3yk
................
r56454 | kurt.kaiser | 2007-07-18 22:26:14 -0700 (Wed, 18 Jul 2007) | 2 lines
Make relative imports explicit for py3k
................
r56455 | kurt.kaiser | 2007-07-18 23:12:15 -0700 (Wed, 18 Jul 2007) | 2 lines
Was modifying dict during iteration.
................
r56457 | guido.van.rossum | 2007-07-19 07:33:19 -0700 (Thu, 19 Jul 2007) | 2 lines
Fix failing test.
................
r56466 | guido.van.rossum | 2007-07-19 20:58:16 -0700 (Thu, 19 Jul 2007) | 35 lines
Merged revisions 56413-56465 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r56439 | georg.brandl | 2007-07-17 23:37:55 -0700 (Tue, 17 Jul 2007) | 2 lines
Use "Unix" as platform name, not "UNIX".
........
r56441 | guido.van.rossum | 2007-07-18 10:19:14 -0700 (Wed, 18 Jul 2007) | 3 lines
SF patch# 1755885 by Kurt Kaiser: show location of Unicode escape errors.
(Slightly tweaked for style and refcounts.)
........
r56444 | kurt.kaiser | 2007-07-18 12:58:42 -0700 (Wed, 18 Jul 2007) | 2 lines
Fix failing unicode test caused by change to ast.c at r56441
........
r56451 | georg.brandl | 2007-07-18 15:36:53 -0700 (Wed, 18 Jul 2007) | 2 lines
Add description for wave.setcomptype() values
........
r56456 | walter.doerwald | 2007-07-19 06:04:38 -0700 (Thu, 19 Jul 2007) | 3 lines
Document that codecs.lookup() returns a CodecInfo object.
(fixes SF bug #1754453).
........
r56463 | facundo.batista | 2007-07-19 16:57:38 -0700 (Thu, 19 Jul 2007) | 6 lines
Added a select.select call in the test server loop to make sure the
socket is ready to be read from before attempting a read (this
prevents an error 10035 on some Windows platforms). [GSoC - Alan
McIntyre]
........
................
2007-07-20 12:05:57 +08:00
|
|
|
from . import RemoteDebugger
|
|
|
|
from . import RemoteObjectBrowser
|
|
|
|
from . import StackViewer
|
|
|
|
from . import rpc
|
2002-05-26 21:36:41 +08:00
|
|
|
|
2002-10-10 16:25:24 +08:00
|
|
|
import __main__
|
|
|
|
|
2003-06-06 07:51:29 +08:00
|
|
|
LOCALHOST = '127.0.0.1'
|
|
|
|
|
2004-07-04 09:25:56 +08: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-23 03:40:19 +08:00
|
|
|
# Thread shared globals: Establish a queue between a subthread (which handles
|
|
|
|
# the socket) and the main thread (which runs user code), plus global
|
|
|
|
# completion and exit flags:
|
|
|
|
|
2003-05-25 04:59:15 +08:00
|
|
|
exit_now = False
|
|
|
|
quitting = False
|
2003-03-23 03:40:19 +08:00
|
|
|
|
2003-05-28 09:47:46 +08:00
|
|
|
def main(del_exitfunc=False):
|
2002-07-26 08:06:42 +08:00
|
|
|
"""Start the Python execution server in a subprocess
|
|
|
|
|
2002-10-10 16:25:24 +08: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 08:06:42 +08:00
|
|
|
|
2003-03-23 03:40:19 +08:00
|
|
|
When the RPCServer 'server' is instantiated, the TCPServer initialization
|
2002-10-10 16:25:24 +08: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 08:06:42 +08:00
|
|
|
|
|
|
|
"""
|
2003-05-25 04:59:15 +08:00
|
|
|
global exit_now
|
|
|
|
global quitting
|
2003-05-28 09:47:46 +08:00
|
|
|
global no_exitfunc
|
|
|
|
no_exitfunc = del_exitfunc
|
2002-05-26 21:36:41 +08:00
|
|
|
port = 8833
|
2004-01-22 02:54:30 +08:00
|
|
|
#time.sleep(15) # test subprocess not responding
|
2002-05-26 21:36:41 +08:00
|
|
|
if sys.argv[1:]:
|
|
|
|
port = int(sys.argv[1])
|
|
|
|
sys.argv[:] = [""]
|
2003-03-23 03:40:19 +08:00
|
|
|
sockthread = threading.Thread(target=manage_socket,
|
|
|
|
name='SockThread',
|
2003-06-06 07:51:29 +08:00
|
|
|
args=((LOCALHOST, port),))
|
2003-03-23 03:40:19 +08:00
|
|
|
sockthread.setDaemon(True)
|
|
|
|
sockthread.start()
|
|
|
|
while 1:
|
|
|
|
try:
|
2003-05-25 04:59:15 +08:00
|
|
|
if exit_now:
|
|
|
|
try:
|
2003-05-28 09:47:46 +08:00
|
|
|
exit()
|
2003-05-25 04:59:15 +08:00
|
|
|
except KeyboardInterrupt:
|
|
|
|
# exiting but got an extra KBI? Try again!
|
|
|
|
continue
|
2003-05-09 04:26:55 +08:00
|
|
|
try:
|
2005-05-06 07:29:54 +08:00
|
|
|
seq, request = rpc.request_queue.get(block=True, timeout=0.05)
|
2003-05-09 04:26:55 +08:00
|
|
|
except Queue.Empty:
|
|
|
|
continue
|
|
|
|
method, args, kwargs = request
|
|
|
|
ret = method(*args, **kwargs)
|
|
|
|
rpc.response_queue.put((seq, ret))
|
2003-05-15 02:15:40 +08:00
|
|
|
except KeyboardInterrupt:
|
2003-05-25 04:59:15 +08:00
|
|
|
if quitting:
|
|
|
|
exit_now = True
|
2003-05-15 02:15:40 +08:00
|
|
|
continue
|
2003-05-18 05:04:10 +08:00
|
|
|
except SystemExit:
|
|
|
|
raise
|
2003-05-12 10:33:47 +08:00
|
|
|
except:
|
2003-05-25 04:59:15 +08:00
|
|
|
type, value, tb = sys.exc_info()
|
2003-05-18 05:04:10 +08:00
|
|
|
try:
|
|
|
|
print_exception()
|
|
|
|
rpc.response_queue.put((seq, None))
|
|
|
|
except:
|
2003-05-25 04:59:15 +08:00
|
|
|
# Link didn't work, print same exception to __stderr__
|
|
|
|
traceback.print_exception(type, value, tb, file=sys.__stderr__)
|
2003-05-28 09:47:46 +08:00
|
|
|
exit()
|
2003-05-25 04:59:15 +08:00
|
|
|
else:
|
|
|
|
continue
|
2003-03-23 03:40:19 +08:00
|
|
|
|
|
|
|
def manage_socket(address):
|
2004-01-22 02:54:30 +08:00
|
|
|
for i in range(3):
|
2002-07-26 08:06:42 +08:00
|
|
|
time.sleep(i)
|
|
|
|
try:
|
2003-05-09 04:26:55 +08:00
|
|
|
server = MyRPCServer(address, MyHandler)
|
2002-07-26 08:06:42 +08:00
|
|
|
break
|
2007-01-11 00:19:56 +08:00
|
|
|
except socket.error as err:
|
2007-02-09 13:37:30 +08:00
|
|
|
print("IDLE Subprocess: socket error: "\
|
|
|
|
+ err[1] + ", retrying....", file=sys.__stderr__)
|
2002-07-26 08:06:42 +08:00
|
|
|
else:
|
2007-02-09 13:37:30 +08:00
|
|
|
print("IDLE Subprocess: Connection to "\
|
|
|
|
"IDLE GUI failed, exiting.", file=sys.__stderr__)
|
2004-01-22 02:54:30 +08:00
|
|
|
show_socket_error(err, address)
|
2003-05-25 04:59:15 +08:00
|
|
|
global exit_now
|
|
|
|
exit_now = True
|
2003-05-09 04:26:55 +08:00
|
|
|
return
|
2003-03-23 03:40:19 +08:00
|
|
|
server.handle_request() # A single request only
|
|
|
|
|
2004-01-22 02:54:30 +08: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 10:33:47 +08:00
|
|
|
def print_exception():
|
2004-01-02 12:04:04 +08:00
|
|
|
import linecache
|
|
|
|
linecache.checkcache()
|
2003-05-12 10:33:47 +08:00
|
|
|
flush_stdout()
|
|
|
|
efile = sys.stderr
|
2003-11-19 12:52:32 +08:00
|
|
|
typ, val, tb = excinfo = sys.exc_info()
|
|
|
|
sys.last_type, sys.last_value, sys.last_traceback = excinfo
|
2003-05-12 10:33:47 +08:00
|
|
|
tbe = traceback.extract_tb(tb)
|
Merged revisions 56492-56752 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/p3yk
........
r56497 | kurt.kaiser | 2007-07-22 14:55:16 -0700 (Sun, 22 Jul 2007) | 4 lines
In the case of syntax errors, in py3k format_exception_only()
was including line number and position in the final line of the
exception notification, duplicating info in previous lines.
........
r56501 | kurt.kaiser | 2007-07-22 19:35:50 -0700 (Sun, 22 Jul 2007) | 2 lines
Hum, needed a newline in the last change.
........
r56536 | kurt.kaiser | 2007-07-24 19:06:48 -0700 (Tue, 24 Jul 2007) | 5 lines
Not all instantiations of SyntaxError set the args attribute.
e.g. symtable.c
Modify format_exception_only() to get SyntaxError attributes directly
instead of unpacking 'args'.
........
r56537 | kurt.kaiser | 2007-07-24 19:13:03 -0700 (Tue, 24 Jul 2007) | 3 lines
Update doctest strings: traceback.py no longer prints redundant location
information in the last line of the exception display.
........
r56627 | kurt.kaiser | 2007-07-29 21:06:57 -0700 (Sun, 29 Jul 2007) | 2 lines
Interactive interpreter emulator (code.py) failing to print exceptions.
........
r56628 | kurt.kaiser | 2007-07-29 21:41:02 -0700 (Sun, 29 Jul 2007) | 2 lines
Eliminate extra lines before and after tracebacks.
........
r56638 | kurt.kaiser | 2007-07-31 19:36:45 -0700 (Tue, 31 Jul 2007) | 3 lines
Refactor syntax error display in shell and edit windows; move
colorize_syntax_error() to EditorWindow; update to py3k.
........
r56685 | neal.norwitz | 2007-08-02 22:20:23 -0700 (Thu, 02 Aug 2007) | 10 lines
Remove several h/w and o/s specific modules that are undocumented, obsolete,
and/or not widely used:
linuxaudiodev.c, sunaudiodev.c Lib/plat-sunos5/SUNAUDIODEV.py
Lib/audiodev.py Tools/audiopy/audiopy
Move Lib/toaiff.py to Demo.
See PEP 3108 for most of the details.
........
r56686 | neal.norwitz | 2007-08-02 22:21:48 -0700 (Thu, 02 Aug 2007) | 4 lines
Missed one module that should have been removed since it relied
on audiodev which was removed.
........
r56748 | neal.norwitz | 2007-08-04 19:19:04 -0700 (Sat, 04 Aug 2007) | 1 line
Make from X import * outside module scope an error.
........
r56750 | neal.norwitz | 2007-08-04 19:35:01 -0700 (Sat, 04 Aug 2007) | 1 line
Use READONLY consistently instead of RO
........
2007-08-05 23:29:28 +08:00
|
|
|
print('Traceback (most recent call last):', file=efile)
|
2003-05-12 10:33:47 +08: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:
|
Merged revisions 56492-56752 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/p3yk
........
r56497 | kurt.kaiser | 2007-07-22 14:55:16 -0700 (Sun, 22 Jul 2007) | 4 lines
In the case of syntax errors, in py3k format_exception_only()
was including line number and position in the final line of the
exception notification, duplicating info in previous lines.
........
r56501 | kurt.kaiser | 2007-07-22 19:35:50 -0700 (Sun, 22 Jul 2007) | 2 lines
Hum, needed a newline in the last change.
........
r56536 | kurt.kaiser | 2007-07-24 19:06:48 -0700 (Tue, 24 Jul 2007) | 5 lines
Not all instantiations of SyntaxError set the args attribute.
e.g. symtable.c
Modify format_exception_only() to get SyntaxError attributes directly
instead of unpacking 'args'.
........
r56537 | kurt.kaiser | 2007-07-24 19:13:03 -0700 (Tue, 24 Jul 2007) | 3 lines
Update doctest strings: traceback.py no longer prints redundant location
information in the last line of the exception display.
........
r56627 | kurt.kaiser | 2007-07-29 21:06:57 -0700 (Sun, 29 Jul 2007) | 2 lines
Interactive interpreter emulator (code.py) failing to print exceptions.
........
r56628 | kurt.kaiser | 2007-07-29 21:41:02 -0700 (Sun, 29 Jul 2007) | 2 lines
Eliminate extra lines before and after tracebacks.
........
r56638 | kurt.kaiser | 2007-07-31 19:36:45 -0700 (Tue, 31 Jul 2007) | 3 lines
Refactor syntax error display in shell and edit windows; move
colorize_syntax_error() to EditorWindow; update to py3k.
........
r56685 | neal.norwitz | 2007-08-02 22:20:23 -0700 (Thu, 02 Aug 2007) | 10 lines
Remove several h/w and o/s specific modules that are undocumented, obsolete,
and/or not widely used:
linuxaudiodev.c, sunaudiodev.c Lib/plat-sunos5/SUNAUDIODEV.py
Lib/audiodev.py Tools/audiopy/audiopy
Move Lib/toaiff.py to Demo.
See PEP 3108 for most of the details.
........
r56686 | neal.norwitz | 2007-08-02 22:21:48 -0700 (Thu, 02 Aug 2007) | 4 lines
Missed one module that should have been removed since it relied
on audiodev which was removed.
........
r56748 | neal.norwitz | 2007-08-04 19:19:04 -0700 (Sat, 04 Aug 2007) | 1 line
Make from X import * outside module scope an error.
........
r56750 | neal.norwitz | 2007-08-04 19:35:01 -0700 (Sat, 04 Aug 2007) | 1 line
Use READONLY consistently instead of RO
........
2007-08-05 23:29:28 +08:00
|
|
|
print(line, end='', file=efile)
|
2003-05-12 10:33:47 +08:00
|
|
|
|
|
|
|
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[:]
|
2007-02-09 13:37:30 +08:00
|
|
|
print("** IDLE Internal Exception: ", file=sys.stderr)
|
2003-05-12 10:33:47 +08:00
|
|
|
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():
|
2007-02-10 07:20:19 +08:00
|
|
|
"""XXX How to do this now?"""
|
2003-05-12 10:33:47 +08:00
|
|
|
|
2003-05-28 09:47:46 +08: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:
|
|
|
|
del sys.exitfunc
|
|
|
|
sys.exit(0)
|
2002-05-26 21:36:41 +08:00
|
|
|
|
2003-05-09 04:26:55 +08: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 23:46:49 +08:00
|
|
|
global quitting
|
2003-05-09 04:26:55 +08:00
|
|
|
try:
|
|
|
|
raise
|
|
|
|
except SystemExit:
|
|
|
|
raise
|
|
|
|
except EOFError:
|
2003-05-25 04:59:15 +08:00
|
|
|
global exit_now
|
|
|
|
exit_now = True
|
2003-06-14 06:03:43 +08:00
|
|
|
thread.interrupt_main()
|
2003-05-09 04:26:55 +08:00
|
|
|
except:
|
|
|
|
erf = sys.__stderr__
|
2007-02-09 13:37:30 +08:00
|
|
|
print('\n' + '-'*40, file=erf)
|
|
|
|
print('Unhandled server exception!', file=erf)
|
|
|
|
print('Thread: %s' % threading.currentThread().getName(), file=erf)
|
|
|
|
print('Client Address: ', client_address, file=erf)
|
|
|
|
print('Request: ', repr(request), file=erf)
|
2003-05-09 04:26:55 +08:00
|
|
|
traceback.print_exc(file=erf)
|
2007-02-09 13:37:30 +08:00
|
|
|
print('\n*** Unrecoverable, server exiting!', file=erf)
|
|
|
|
print('-'*40, file=erf)
|
2004-11-19 23:46:49 +08:00
|
|
|
quitting = True
|
|
|
|
thread.interrupt_main()
|
2003-05-09 04:26:55 +08:00
|
|
|
|
|
|
|
|
2002-05-26 21:36:41 +08:00
|
|
|
class MyHandler(rpc.RPCHandler):
|
|
|
|
|
|
|
|
def handle(self):
|
2003-03-23 03:40:19 +08:00
|
|
|
"""Override base method"""
|
2002-05-26 21:36:41 +08:00
|
|
|
executive = Executive(self)
|
|
|
|
self.register("exec", executive)
|
2003-06-02 09:50:19 +08:00
|
|
|
sys.stdin = self.console = self.get_remote_proxy("stdin")
|
2002-05-26 21:36:41 +08:00
|
|
|
sys.stdout = self.get_remote_proxy("stdout")
|
|
|
|
sys.stderr = self.get_remote_proxy("stderr")
|
Merged revisions 56443-56466 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/p3yk
................
r56454 | kurt.kaiser | 2007-07-18 22:26:14 -0700 (Wed, 18 Jul 2007) | 2 lines
Make relative imports explicit for py3k
................
r56455 | kurt.kaiser | 2007-07-18 23:12:15 -0700 (Wed, 18 Jul 2007) | 2 lines
Was modifying dict during iteration.
................
r56457 | guido.van.rossum | 2007-07-19 07:33:19 -0700 (Thu, 19 Jul 2007) | 2 lines
Fix failing test.
................
r56466 | guido.van.rossum | 2007-07-19 20:58:16 -0700 (Thu, 19 Jul 2007) | 35 lines
Merged revisions 56413-56465 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r56439 | georg.brandl | 2007-07-17 23:37:55 -0700 (Tue, 17 Jul 2007) | 2 lines
Use "Unix" as platform name, not "UNIX".
........
r56441 | guido.van.rossum | 2007-07-18 10:19:14 -0700 (Wed, 18 Jul 2007) | 3 lines
SF patch# 1755885 by Kurt Kaiser: show location of Unicode escape errors.
(Slightly tweaked for style and refcounts.)
........
r56444 | kurt.kaiser | 2007-07-18 12:58:42 -0700 (Wed, 18 Jul 2007) | 2 lines
Fix failing unicode test caused by change to ast.c at r56441
........
r56451 | georg.brandl | 2007-07-18 15:36:53 -0700 (Wed, 18 Jul 2007) | 2 lines
Add description for wave.setcomptype() values
........
r56456 | walter.doerwald | 2007-07-19 06:04:38 -0700 (Thu, 19 Jul 2007) | 3 lines
Document that codecs.lookup() returns a CodecInfo object.
(fixes SF bug #1754453).
........
r56463 | facundo.batista | 2007-07-19 16:57:38 -0700 (Thu, 19 Jul 2007) | 6 lines
Added a select.select call in the test server loop to make sure the
socket is ready to be read from before attempting a read (this
prevents an error 10035 on some Windows platforms). [GSoC - Alan
McIntyre]
........
................
2007-07-20 12:05:57 +08:00
|
|
|
from . import IOBinding
|
2003-06-22 15:52:56 +08:00
|
|
|
sys.stdin.encoding = sys.stdout.encoding = \
|
|
|
|
sys.stderr.encoding = IOBinding.encoding
|
2003-06-02 09:50:19 +08:00
|
|
|
self.interp = self.get_remote_proxy("interp")
|
2003-05-09 04:26:55 +08: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-25 04:59:15 +08:00
|
|
|
time.sleep(10)
|
2003-05-09 04:26:55 +08:00
|
|
|
|
|
|
|
def EOFhook(self):
|
|
|
|
"Override SocketIO method - terminate wait on callback and exit thread"
|
2003-05-25 04:59:15 +08:00
|
|
|
global quitting
|
|
|
|
quitting = True
|
2003-06-14 06:03:43 +08:00
|
|
|
thread.interrupt_main()
|
2003-05-09 04:26:55 +08:00
|
|
|
|
|
|
|
def decode_interrupthook(self):
|
|
|
|
"interrupt awakened thread"
|
2003-05-25 04:59:15 +08:00
|
|
|
global quitting
|
|
|
|
quitting = True
|
2003-06-14 06:03:43 +08:00
|
|
|
thread.interrupt_main()
|
2003-03-23 03:40:19 +08:00
|
|
|
|
2002-05-26 21:36:41 +08:00
|
|
|
|
2004-12-22 06:10:32 +08:00
|
|
|
class Executive(object):
|
2002-05-26 21:36:41 +08:00
|
|
|
|
|
|
|
def __init__(self, rpchandler):
|
2002-06-26 10:32:09 +08:00
|
|
|
self.rpchandler = rpchandler
|
2002-08-25 22:08:07 +08:00
|
|
|
self.locals = __main__.__dict__
|
2002-10-10 16:25:24 +08:00
|
|
|
self.calltip = CallTips.CallTips()
|
2005-11-19 06:05:48 +08:00
|
|
|
self.autocomplete = AutoComplete.AutoComplete()
|
2002-05-26 21:36:41 +08:00
|
|
|
|
|
|
|
def runcode(self, code):
|
2003-02-28 07:04:17 +08:00
|
|
|
try:
|
2003-06-02 09:50:19 +08:00
|
|
|
self.usr_exc_info = None
|
2006-09-06 14:51:57 +08:00
|
|
|
exec(code, self.locals)
|
2003-02-28 07:04:17 +08:00
|
|
|
except:
|
2003-06-02 09:50:19 +08:00
|
|
|
self.usr_exc_info = sys.exc_info()
|
2003-05-25 04:59:15 +08:00
|
|
|
if quitting:
|
2003-05-28 09:47:46 +08:00
|
|
|
exit()
|
2003-05-25 04:59:15 +08:00
|
|
|
# even print a user code SystemExit exception, continue
|
|
|
|
print_exception()
|
2003-06-02 09:50:19 +08:00
|
|
|
jit = self.rpchandler.console.getvar("<<toggle-jit-stack-viewer>>")
|
|
|
|
if jit:
|
|
|
|
self.rpchandler.interp.open_remote_stack_viewer()
|
2003-03-23 03:40:19 +08:00
|
|
|
else:
|
2003-05-12 10:33:47 +08:00
|
|
|
flush_stdout()
|
2002-05-26 21:36:41 +08:00
|
|
|
|
2003-02-18 02:57:16 +08:00
|
|
|
def interrupt_the_server(self):
|
2003-06-14 06:03:43 +08:00
|
|
|
thread.interrupt_main()
|
2003-03-23 03:40:19 +08:00
|
|
|
|
2002-06-16 11:32:24 +08:00
|
|
|
def start_the_debugger(self, gui_adap_oid):
|
2002-06-26 10:32:09 +08: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 21:36:41 +08:00
|
|
|
|
2002-10-10 16:25:24 +08:00
|
|
|
def get_the_calltip(self, name):
|
|
|
|
return self.calltip.fetch_tip(name)
|
|
|
|
|
2005-11-19 06:05:48 +08:00
|
|
|
def get_the_completion_list(self, what, mode):
|
|
|
|
return self.autocomplete.fetch_completions(what, mode)
|
|
|
|
|
2002-05-26 21:36:41 +08:00
|
|
|
def stackviewer(self, flist_oid=None):
|
2003-06-02 09:50:19 +08:00
|
|
|
if self.usr_exc_info:
|
|
|
|
typ, val, tb = self.usr_exc_info
|
|
|
|
else:
|
2002-05-26 21:36:41 +08:00
|
|
|
return None
|
|
|
|
flist = None
|
|
|
|
if flist_oid is not None:
|
2002-06-26 10:32:09 +08:00
|
|
|
flist = self.rpchandler.get_remote_proxy(flist_oid)
|
2002-05-26 21:36:41 +08:00
|
|
|
while tb and tb.tb_frame.f_globals["__name__"] in ["rpc", "run"]:
|
|
|
|
tb = tb.tb_next
|
2003-06-02 09:50:19 +08:00
|
|
|
sys.last_type = typ
|
|
|
|
sys.last_value = val
|
2002-05-26 21:36:41 +08:00
|
|
|
item = StackViewer.StackTreeItem(flist, tb)
|
|
|
|
return RemoteObjectBrowser.remote_object_tree_item(item)
|