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
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
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':