[pypy-svn] r10031 - in pypy/dist/pypy: interpreter tool
rxe at codespeak.net
rxe at codespeak.net
Mon Mar 21 23:32:19 CET 2005
Author: rxe
Date: Mon Mar 21 23:32:19 2005
New Revision: 10031
Removed:
pypy/dist/pypy/tool/traceinteractive.py
Modified:
pypy/dist/pypy/interpreter/interactive.py
pypy/dist/pypy/interpreter/py.py
Log:
Merge traceinteractive.py with interactive.py.
-C option on py.py enables command line completion.
Modified: pypy/dist/pypy/interpreter/interactive.py
==============================================================================
--- pypy/dist/pypy/interpreter/interactive.py (original)
+++ pypy/dist/pypy/interpreter/interactive.py Mon Mar 21 23:32:19 2005
@@ -7,8 +7,86 @@
import time
+class Completer:
+ """ Stolen mostly from CPython's rlcompleter.py """
+ def __init__(self, space, w_globals):
+ self.space = space
+ self.w_globals = w_globals
+
+ def complete(self, text, state):
+ if state == 0:
+ if "." in text:
+ self.matches = self.attr_matches(text)
+ else:
+ self.matches = self.global_matches(text)
+ try:
+ return self.matches[state]
+
+ except IndexError:
+ return None
+
+ def global_matches(self, text):
+ import keyword
+ w_res = self.space.call_method(self.w_globals, "keys")
+ namespace_keys = self.space.unwrap(w_res)
+ w_res = self.space.call_method(self.space.builtin.getdict(), "keys")
+ builtin_keys = self.space.unwrap(w_res)
+
+ matches = []
+ n = len(text)
+
+ for l in [namespace_keys, builtin_keys, keyword.kwlist]:
+ for word in l:
+ if word[:n] == text and word != "__builtins__":
+ matches.append(word)
+
+ return matches
+
+ def attr_matches(self, text):
+ import re
+ m = re.match(r"(\w+(\.\w+)*)\.(\w*)", text)
+ if not m:
+ return
+
+ expr, attr = m.group(1, 3)
+ s = self.space
+ w_obj = s.eval(expr, self.w_globals, self.w_globals)
+ words = self.get_words(w_obj)
+
+ w_clz = s.getattr(w_obj, s.wrap("__class__"))
+ words += self.get_class_members(w_clz)
+
+ matches = []
+ n = len(attr)
+ for word in words:
+ if word[:n] == attr and word != "__builtins__":
+ matches.append("%s.%s" % (expr, word))
+
+ return matches
+
+ def get_words(self, w_clz):
+ s = self.space
+ w_dir_func = s.builtin.get("dir")
+ w_res = s.call_function(w_dir_func, w_clz)
+ return s.unwrap(w_res)
+
+ def get_class_members(self, w_clz):
+ s = self.space
+ words = self.get_words(w_clz)
+ try:
+ w_bases = s.getattr(w_clz, s.wrap("__bases__"))
+ bases_w = s.unpacktuple(w_bases)
+
+ except OperationError:
+ return words
+
+ for w_clz in bases_w:
+ words += self.get_class_members(w_clz)
+
+ return words
+
class PyPyConsole(code.InteractiveConsole):
- def __init__(self, objspace, verbose=0):
+ def __init__(self, objspace, verbose=0, completer=False):
code.InteractiveConsole.__init__(self)
self.space = objspace
self.verbose = verbose
@@ -19,16 +97,38 @@
mainmodule = main.ensure__main__(space)
self.w_globals = mainmodule.w_dict
space.setitem(self.w_globals, space.wrap('__builtins__'), space.builtin)
+ if completer:
+ self.enable_command_line_completer()
# XXX check: do we need self.ec, self.w_globals?
+ space.exec_("__pytrace__ = 0", self.w_globals, self.w_globals)
+ self.tracelevel = 0
+
+ def enable_command_line_completer(self):
+ try:
+ import readline
+ # Keep here to save windoze tears
+ readline.set_completer(Completer(self.space, self.w_globals).complete)
+ readline.parse_and_bind("tab: complete")
+ readline.set_history_length(25000)
+
+ try:
+ readline.read_history_file()
+ except IOError:
+ pass # guess it doesn't exit
+
+ import atexit
+ atexit.register(readline.write_history_file)
+ except:
+ pass
+
def interact(self, banner=None):
- if banner is None:
- #banner = "Python %s in pypy\n%s / %s" % (
- # sys.version, self.__class__.__name__,
- # self.space.__class__.__name__)
- elapsed = time.time() - self.space._starttime
- banner = "PyPy in %s on top of Python %s (startupttime: %.2f secs)" % (
- self.space.__repr__(), sys.version.split()[0], elapsed)
+ #banner = "Python %s in pypy\n%s / %s" % (
+ # sys.version, self.__class__.__name__,
+ # self.space.__class__.__name__)
+ elapsed = time.time() - self.space._starttime
+ banner = "PyPy in %s on top of Python %s (startupttime: %.2f secs)" % (
+ self.space.__repr__(), sys.version.split()[0], elapsed)
code.InteractiveConsole.interact(self, banner)
def raw_input(self, prompt=""):
@@ -60,7 +160,10 @@
from pypy.interpreter.pycode import PyCode
pycode = PyCode(self.space)._from_code(code)
try:
+ self.settrace()
pycode.exec_code(self.space, self.w_globals, self.w_globals)
+ self.checktrace()
+
except error.OperationError, operationerr:
space = self.space
try:
@@ -102,7 +205,7 @@
pass
def runsource(self, source, ignored_filename="<input>", symbol="single"):
- hacked_filename = '<inline>\n'+source
+ hacked_filename = '<inline>' + source
try:
code = self.compile(source, hacked_filename, symbol)
except (OverflowError, SyntaxError, ValueError):
@@ -113,6 +216,43 @@
self.runcode(code)
return 0
+ def settrace(self):
+ if self.tracelevel:
+ self.space.settrace()
+
+ def checktrace(self):
+ from pypy.objspace import trace
+
+ s = self.space
+
+ # Did we modify __pytrace__
+ tracelevel = s.int_w(s.getitem(self.w_globals,
+ s.wrap("__pytrace__")))
+
+ if self.tracelevel > 0 and tracelevel == 0:
+ s.reset_trace()
+ print "Tracing disabled"
+
+ if self.tracelevel == 0 and tracelevel > 0:
+ trace.create_trace_space(s)
+ print "Tracing enabled"
+
+ self.tracelevel = tracelevel
+
+ def set_tracelevel(self, tracelevel):
+ # Disable tracing altogether?
+ from pypy.objspace import trace
+
+ if self.tracelevel > 0 and tracelevel == 0:
+ self.space.reset_trace()
+ print self.get_banner()
+
+ if self.tracelevel == 0 and tracelevel > 0:
+ trace.create_trace_space(self.space)
+ print self.get_banner()
+
+ self.tracelevel = tracelevel
+
if __name__ == '__main__':
try:
import readline
Modified: pypy/dist/pypy/interpreter/py.py
==============================================================================
--- pypy/dist/pypy/interpreter/py.py (original)
+++ pypy/dist/pypy/interpreter/py.py Mon Mar 21 23:32:19 2005
@@ -18,6 +18,7 @@
verbose = os.getenv('PYPY_TB')
interactive = 0
command = []
+ completer = False
def get_main_options():
options = option.get_standard_options()
@@ -27,6 +28,10 @@
help='show verbose interpreter-level traceback'))
options.append(make_option(
+ '-C', action='store_true', dest='completer',
+ help='use readline commandline completer'))
+
+ options.append(make_option(
'-i', action="store_true", dest="interactive",
help="inspect interactively after running script"))
@@ -78,7 +83,7 @@
else:
operationerr.print_application_traceback(space)
if go_interactive:
- con = interactive.PyPyConsole(space, Options.verbose)
+ con = interactive.PyPyConsole(space, verbose=Options.verbose, completer=Options.completer)
if banner == '':
banner = '%s / %s'%(con.__class__.__name__,
space.__class__.__name__)
Deleted: /pypy/dist/pypy/tool/traceinteractive.py
==============================================================================
--- /pypy/dist/pypy/tool/traceinteractive.py Mon Mar 21 23:32:19 2005
+++ (empty file)
@@ -1,252 +0,0 @@
-# Standard imports
-import re
-import sys
-import code
-import keyword
-
-assert sys.version_info >= (2,3), "sorry, can only run with python2.3 and greater"
-
-try:
- import readline
- have_readline = True
-
-except:
- have_readline = False
-
-
-# PyPy imports
-import autopath
-
-from pypy.tool import pydis
-
-from pypy.interpreter import executioncontext, pyframe, baseobjspace
-from pypy.interpreter.baseobjspace import ObjSpace
-
-from pypy.objspace import trace
-
-class Completer:
- """ Stolen mostly from CPython's rlcompleter.py """
- def __init__(self, space):
- self.space = space
-
- def complete(self, text, state):
- if state == 0:
- if "." in text:
- self.matches = self.attr_matches(text)
- else:
- self.matches = self.global_matches(text)
- try:
- return self.matches[state]
-
- except IndexError:
- return None
-
- def global_matches(self, text):
- w_res = self.space.call_method(self.space.w_globals, "keys")
- namespace_keys = self.space.unwrap(w_res)
-
- w_res = self.space.call_method(self.space.builtin.getdict(), "keys")
- builtin_keys = self.space.unwrap(w_res)
-
- matches = []
- n = len(text)
-
- for l in [namespace_keys, builtin_keys, keyword.kwlist]:
- for word in l:
- if word[:n] == text and word != "__builtins__":
- matches.append(word)
-
- return matches
-
- def attr_matches(self, text):
- m = re.match(r"(\w+(\.\w+)*)\.(\w*)", text)
- if not m:
- return
-
- expr, attr = m.group(1, 3)
- s = self.space
- w_obj = s.eval(expr, s.w_globals, s.w_globals)
- words = self.get_words(w_obj)
-
- w_clz = s.getattr(w_obj, s.wrap("__class__"))
- words += self.get_class_members(w_clz)
-
- matches = []
- n = len(attr)
- for word in words:
- if word[:n] == attr and word != "__builtins__":
- matches.append("%s.%s" % (expr, word))
-
- return matches
-
- def get_words(self, w_clz):
- s = self.space
- w_dir_func = s.builtin.get("dir")
- w_res = s.call_function(w_dir_func, w_clz)
- return s.unwrap(w_res)
-
- def get_class_members(self, w_clz):
- s = self.space
- words = self.get_words(w_clz)
- try:
- w_bases = s.getattr(w_clz, s.wrap("__bases__"))
- bases_w = s.unpacktuple(w_bases)
-
- except OperationError:
- return words
-
- for w_clz in bases_w:
- words += self.get_class_members(w_clz)
-
- return words
-
-class TraceConsole(code.InteractiveConsole):
- def __init__(self, space):
- code.InteractiveConsole.__init__(self)
- s = self.space = space
- s.setitem(s.w_globals, s.wrap("__pytrace__"), s.wrap(0))
- # Trace is binary (on or off), but we have different print levels
- # for tracelevel > 0
- self.tracelevel = 0
-
- def interact(self, banner=None):
- if banner is None:
- banner = self.get_banner()
- code.InteractiveConsole.interact(self, banner)
-
- def get_banner(self):
- banner = "PyPy in %s on top of CPython %s\n%s" % (
- space.__class__.__name__, sys.version.split()[0],
- " [Use __pytrace__ to set trace level (zero is default and does no tracing)]" )
- return banner
-
- def raw_input(self, prompt=""):
- # add a character to the PyPy prompt so that you know where you
- # are when you debug it with "python -i py.py"
- try:
- return code.InteractiveConsole.raw_input(self, prompt[0] + prompt)
-
- except KeyboardInterrupt:
- s = self.space
- # fires into an interpreter-level console
- print
- banner = ("Python %s on %s\n" % (sys.version, sys.platform) +
- "*** Entering interpreter-level console ***")
- local = self.__dict__.copy()
- for w_name in s.unpackiterable(s.w_globals):
- local['w_' + s.unwrap(w_name)] = (
- s.getitem(s.w_globals, w_name))
- code.interact(banner=banner, local=local)
- # copy back 'w_' names
- for name in local:
- if name.startswith('w_'):
- s.setitem(s.w_globals,
- s.wrap(name[2:]),
- local[name])
- print '*** Leaving interpreter-level console ***'
- raise
-
- def set_tracelevel(self, tracelevel):
- # Disable tracing altogether?
- if self.tracelevel > 0 and tracelevel == 0:
- self.space.reset_trace()
- print self.get_banner()
-
- if self.tracelevel == 0 and tracelevel > 0:
- trace.create_trace_space(self.space)
- print self.get_banner()
-
- self.tracelevel = tracelevel
-
- def runcode(self, code):
- # 'code' is a CPython code object
- from pypy.interpreter.pycode import PyCode
- s = self.space
-
- pycode = PyCode(s)._from_code(code)
-
- try:
- if self.tracelevel:
- s.settrace()
-
- pycode.exec_code(s, s.w_globals, s.w_globals)
-
- res = None
- if self.tracelevel:
- res = s.getresult()
- s.settrace()
-
- # Did we modify __pytrace__
- tracelevel = s.unwrap(s.getitem(s.w_globals,
- s.wrap("__pytrace__")))
-
- if tracelevel != self.tracelevel:
- self.set_tracelevel(tracelevel)
-
- #if res is not None and self.tracelevel:
- # self.resprinter.print_result(s, res)
-
- except baseobjspace.OperationError, operationerr:
- if self.tracelevel:
- res = s.getresult()
- s.settrace()
-
- # XXX insert exception info into the application-level sys.last_xxx
- print
- operationerr.print_application_traceback(self.space)
-
- else:
- print
-
- def runsource(self, source, ignored_filename = "<input>", symbol = "single"):
- hacked_filename = '<inline> ' + source[:80] + "..."
- hacked_filename = hacked_filename.replace("\n", r"\n")
- try:
- code = self.compile(source, hacked_filename, symbol)
-
- except (OverflowError, SyntaxError, ValueError):
- self.showsyntaxerror(self.filename)
- return False
-
- if code is None:
- return True
-
- self.runcode(code)
- return False
-
-def trace_interactive(space, banner = None):
- s = space
-
- # Create an execution context, and set the globals
- ec = s.getexecutioncontext()
- s.w_globals = ec.make_standard_w_globals()
-
- s.setitem(s.w_globals, s.wrap("__name__"), s.wrap("__main__"))
- console = TraceConsole(s)
-
- if have_readline:
- # Keep here to save windoze tears
- readline.set_completer(Completer(s).complete)
- readline.parse_and_bind("tab: complete")
- readline.set_history_length(25000)
-
- try:
- readline.read_history_file()
-
- except IOError:
- pass # guess it doesn't exit
-
- import atexit
- atexit.register(readline.write_history_file)
-
- console.interact(banner)
-
-if __name__ == '__main__':
-
- from pypy.tool import option
- args = option.process_options(option.get_standard_options(),
- option.Options)
-
- # Create objspace...
- space = option.objspace()
- trace_interactive(space)
More information about the Pypy-commit
mailing list