unary_folders = { ast.Not: _fold_not, ast.USub: _unary_fold("neg"), ast.UAdd: _unary_fold("pos"), ast.Invert: _unary_fold("invert") } unrolling_unary_folders = unrolling_iterable(unary_folders.items()) for folder in binary_folders.values() + unary_folders.values(): folder._always_inline_ = True del folder opposite_compare_operations = misc.dict_to_switch({ ast.Is: ast.IsNot, ast.IsNot: ast.Is, ast.In: ast.NotIn, ast.NotIn: ast.In }) class OptimizingVisitor(ast.ASTVisitor): """Constant folds AST.""" def __init__(self, space, compile_info): self.space = space self.compile_info = compile_info def default_visitor(self, node): return node def visit_BinOp(self, binop): left = binop.left.as_constant()
from rpython.rlib.objectmodel import specialize from pypy.interpreter.astcompiler import ast, assemble, symtable, consts, misc from pypy.interpreter.astcompiler import optimize # For side effects from pypy.interpreter.pyparser.error import SyntaxError from pypy.tool import stdlib_opcode as ops def compile_ast(space, module, info): """Generate a code object from AST.""" symbols = symtable.SymtableBuilder(space, module, info) return TopLevelCodeGenerator(space, module, symbols, info).assemble() name_ops_default = misc.dict_to_switch({ ast.Load: ops.LOAD_NAME, ast.Store: ops.STORE_NAME, ast.Del: ops.DELETE_NAME }) name_ops_fast = misc.dict_to_switch({ ast.Load: ops.LOAD_FAST, ast.Store: ops.STORE_FAST, ast.Del: ops.DELETE_FAST }) name_ops_deref = misc.dict_to_switch({ ast.Load: ops.LOAD_DEREF, ast.Store: ops.STORE_DEREF, }) name_ops_global = misc.dict_to_switch({
from pypy.interpreter.astcompiler import ast, assemble, symtable, consts, misc from pypy.interpreter.astcompiler import optimize # For side effects from pypy.interpreter.pyparser.error import SyntaxError from pypy.tool import stdlib_opcode as ops def compile_ast(space, module, info): """Generate a code object from AST.""" symbols = symtable.SymtableBuilder(space, module, info) return TopLevelCodeGenerator(space, module, symbols, info).assemble() name_ops_default = misc.dict_to_switch({ ast.Load: ops.LOAD_NAME, ast.Store: ops.STORE_NAME, ast.Del: ops.DELETE_NAME }) name_ops_fast = misc.dict_to_switch({ ast.Load: ops.LOAD_FAST, ast.Store: ops.STORE_FAST, ast.Del: ops.DELETE_FAST }) name_ops_deref = misc.dict_to_switch({ ast.Load: ops.LOAD_DEREF, ast.Store: ops.STORE_DEREF, }) name_ops_global = misc.dict_to_switch({
unary_folders = { ast.Not : _fold_not, ast.USub : _unary_fold("neg"), ast.UAdd : _unary_fold("pos"), ast.Invert : _unary_fold("invert") } unrolling_unary_folders = unrolling_iterable(unary_folders.items()) for folder in binary_folders.values() + unary_folders.values(): folder._always_inline_ = True del folder opposite_compare_operations = misc.dict_to_switch({ ast.Is : ast.IsNot, ast.IsNot : ast.Is, ast.In : ast.NotIn, ast.NotIn : ast.In }) class OptimizingVisitor(ast.ASTVisitor): """Constant folds AST.""" def __init__(self, space, compile_info): self.space = space self.compile_info = compile_info def default_visitor(self, node): return node def visit_BinOp(self, binop):