Beispiel #1
0
def compile_with_astcompiler(expr, mode, space):
    ast = source2ast(expr, mode, space)
    misc.set_filename('<testing>', ast)
    ast = opt.optimize_ast_tree(space, ast)
    if mode == 'exec':
        Generator = pycodegen.ModuleCodeGenerator
    elif mode == 'single':
        Generator = pycodegen.InteractiveCodeGenerator
    elif mode == 'eval':
        Generator = pycodegen.ExpressionCodeGenerator
    codegen = Generator(space, ast)
    rcode = codegen.getCode()
    assert isinstance(rcode, PyCode)
    assert rcode.co_filename == '<testing>'
    return rcode
Beispiel #2
0
def compile_with_astcompiler(expr, mode, space):
    ast = source2ast(expr, mode, space)
    misc.set_filename("<testing>", ast)
    ast = opt.optimize_ast_tree(space, ast)
    if mode == "exec":
        Generator = pycodegen.ModuleCodeGenerator
    elif mode == "single":
        Generator = pycodegen.InteractiveCodeGenerator
    elif mode == "eval":
        Generator = pycodegen.ExpressionCodeGenerator
    codegen = Generator(space, ast)
    rcode = codegen.getCode()
    assert isinstance(rcode, PyCode)
    assert rcode.co_filename == "<testing>"
    return rcode
Beispiel #3
0
class PythonAstCompiler(PyCodeCompiler):
    """Uses the stdlib's python implementation of compiler

    XXX: This class should override the baseclass implementation of
         compile_command() in order to optimize it, especially in case
         of incomplete inputs (e.g. we shouldn't re-compile from sracth
         the whole source after having only added a new '\n')
    """
    def __init__(self, space, override_version=None):

        from pyparser.pythonparse import make_pyparser
        PyCodeCompiler.__init__(self, space)
        self.grammar_version = override_version or space.config.objspace.pyversion
        self.parser = make_pyparser(self.grammar_version)
        self.additional_rules = {}
        if self.grammar_version >= '2.5':
            self.futureFlags = future.futureFlags_2_5
        else:
            self.futureFlags = future.futureFlags_2_4
        self.compiler_flags = self.futureFlags.allowed_flags

    def compile(self, source, filename, mode, flags):
        from pypy.interpreter.pyparser.error import SyntaxError
        from pypy.interpreter import astcompiler
        from pypy.interpreter.astcompiler.pycodegen import ModuleCodeGenerator
        from pypy.interpreter.astcompiler.pycodegen import InteractiveCodeGenerator
        from pypy.interpreter.astcompiler.pycodegen import ExpressionCodeGenerator
        from pypy.interpreter.astcompiler.ast import Node
        from pypy.interpreter.astcompiler import opt
        from pyparser.astbuilder import AstBuilder
        from pypy.interpreter.pycode import PyCode
        from pypy.interpreter.function import Function

        from pypy.interpreter.pyparser.future import getFutures

        ##         flags |= stdlib___future__.generators.compiler_flag   # always on (2.2 compat)
        space = self.space
        try:
            builder = AstBuilder(self.parser,
                                 self.grammar_version,
                                 space=space)
            for rulename, buildfunc in self.additional_rules.iteritems():
                assert isinstance(buildfunc, Function)
                builder.user_build_rules[rulename] = buildfunc
            flags |= getFutures(self.futureFlags, source)
            self.parser.parse_source(source, mode, builder, flags)
            ast_tree = builder.rule_stack[-1]
            encoding = builder.source_encoding
        except SyntaxError, e:
            raise OperationError(space.w_SyntaxError,
                                 e.wrap_info(space, filename))

        ast_tree = opt.optimize_ast_tree(space, ast_tree)

        if not space.is_w(self.w_compile_hook, space.w_None):
            try:
                w_ast_tree = space.call_function(self.w_compile_hook,
                                                 space.wrap(ast_tree),
                                                 space.wrap(encoding),
                                                 space.wrap(filename))
                ast_tree = space.interp_w(Node, w_ast_tree)
            except OperationError:
                self.w_compile_hook = space.w_None
                raise
        try:
            astcompiler.misc.set_filename(filename, ast_tree)
            flag_names = self.futureFlags.get_flag_names(space, flags)
            if mode == 'exec':
                codegenerator = ModuleCodeGenerator(space, ast_tree,
                                                    flag_names)
            elif mode == 'single':
                codegenerator = InteractiveCodeGenerator(
                    space, ast_tree, flag_names)
            else:  # mode == 'eval':
                codegenerator = ExpressionCodeGenerator(
                    space, ast_tree, flag_names)
            c = codegenerator.getCode()
        except SyntaxError, e:
            raise OperationError(space.w_SyntaxError,
                                 e.wrap_info(space, filename))
                assert isinstance(buildfunc, Function)
                builder.user_build_rules[rulename] = buildfunc
            flags |= getFutures(self.futureFlags, source)
            self.parser.parse_source(source, mode, builder, flags)
            ast_tree = builder.rule_stack[-1]
            encoding = builder.source_encoding
        except IndentationError, e:
            raise OperationError(space.w_IndentationError,
                                 e.wrap_info(space, filename))
        except TokenIndentationError, e:
            raise OperationError(space.w_IndentationError,
                                 e.wrap_info(space, filename))
        except SyntaxError, e:
            raise OperationError(space.w_SyntaxError,
                                 e.wrap_info(space, filename))
        ast_tree = opt.optimize_ast_tree(space, ast_tree)

        if not space.is_w(self.w_compile_hook, space.w_None):
            try:
                w_ast_tree = space.call_function(self.w_compile_hook,
                                                 space.wrap(ast_tree),
                                                 space.wrap(encoding),
                                                 space.wrap(filename))
                ast_tree = space.interp_w(Node, w_ast_tree)
            except OperationError:
                self.w_compile_hook = space.w_None
                raise
        try:
            astcompiler.misc.set_filename(filename, ast_tree)
            flag_names = self.futureFlags.get_flag_names(space, flags)
            if mode == 'exec':