From d4aff1fc0ba0ab9719c444253b5877f8735072b7 Mon Sep 17 00:00:00 2001 From: David Lord Date: Tue, 3 Dec 2019 08:57:41 -0800 Subject: apply optimizer to all Expr nodes --- CHANGES.rst | 2 ++ jinja2/optimizer.py | 32 ++++++++++++++++---------------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index f5f2e7c..6df6d24 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -88,6 +88,8 @@ Unreleased - Add a ``DerivedContextReference`` node that can be used by extensions to get the current context and local variables such as ``loop``. :issue:`860` +- Constant folding during compilation is applied to some node types + that were previously overlooked. :issue:`733` Version 2.10.3 diff --git a/jinja2/optimizer.py b/jinja2/optimizer.py index 65ab3ce..7065424 100644 --- a/jinja2/optimizer.py +++ b/jinja2/optimizer.py @@ -28,22 +28,22 @@ def optimize(node, environment): class Optimizer(NodeTransformer): - def __init__(self, environment): self.environment = environment - def fold(self, node, eval_ctx=None): - """Do constant folding.""" - node = self.generic_visit(node) - try: - return nodes.Const.from_untrusted(node.as_const(eval_ctx), - lineno=node.lineno, - environment=self.environment) - except nodes.Impossible: - return node - - visit_Add = visit_Sub = visit_Mul = visit_Div = visit_FloorDiv = \ - visit_Pow = visit_Mod = visit_And = visit_Or = visit_Pos = visit_Neg = \ - visit_Not = visit_Compare = visit_Getitem = visit_Getattr = visit_Call = \ - visit_Filter = visit_Test = visit_CondExpr = fold - del fold + def generic_visit(self, node, *args, **kwargs): + node = super(Optimizer, self).generic_visit(node, *args, **kwargs) + + # Do constant folding. Some other nodes besides Expr have + # as_const, but folding them causes errors later on. + if isinstance(node, nodes.Expr): + try: + return nodes.Const.from_untrusted( + node.as_const(args[0] if args else None), + lineno=node.lineno, + environment=self.environment, + ) + except nodes.Impossible: + pass + + return node -- cgit v1.2.1