summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Lord <davidism@gmail.com>2019-12-03 08:57:41 -0800
committerDavid Lord <davidism@gmail.com>2019-12-03 09:08:37 -0800
commitd4aff1fc0ba0ab9719c444253b5877f8735072b7 (patch)
treeac9bfcb5054297878b79b58a7a2d9cfa64f88924
parent06238a9dba2f80c17c94b487972aeaa111027de4 (diff)
downloadjinja2-d4aff1fc0ba0ab9719c444253b5877f8735072b7.tar.gz
apply optimizer to all Expr nodes
-rw-r--r--CHANGES.rst2
-rw-r--r--jinja2/optimizer.py32
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