| 28 | |
| 29 | |
| 30 | class Optimizer(NodeTransformer): |
| 31 | |
| 32 | def __init__(self, environment): |
| 33 | self.environment = environment |
| 34 | |
| 35 | def fold(self, node, eval_ctx=None): |
| 36 | """Do constant folding.""" |
| 37 | node = self.generic_visit(node) |
| 38 | try: |
| 39 | return nodes.Const.from_untrusted(node.as_const(eval_ctx), |
| 40 | lineno=node.lineno, |
| 41 | environment=self.environment) |
| 42 | except nodes.Impossible: |
| 43 | return node |
| 44 | |
| 45 | visit_Add = visit_Sub = visit_Mul = visit_Div = visit_FloorDiv = \ |
| 46 | visit_Pow = visit_Mod = visit_And = visit_Or = visit_Pos = visit_Neg = \ |
| 47 | visit_Not = visit_Compare = visit_Getitem = visit_Getattr = visit_Call = \ |
| 48 | visit_Filter = visit_Test = visit_CondExpr = fold |
| 49 | del fold |