
Change log:95336cb92b..191d55580e
Full diff:95336cb92b..191d55580e
Roll chromium third_party 4e16929f46..3a8f2a9e1e Change log:4e16929f46..3a8f2a9e1e
Changed dependencies: * src/tools:c44a3f5eca..f524a53b81
DEPS diff:95336cb92b..191d55580e
/DEPS No update to Clang. TBR=titovartem@google.com, BUG=None CQ_INCLUDE_TRYBOTS=master.internal.tryserver.corp.webrtc:linux_internal Change-Id: Ic9c4a62b050383646e9fcf5cc07a5653c14ac06e Reviewed-on: https://webrtc-review.googlesource.com/76120 Reviewed-by: Patrik Höglund <phoglund@webrtc.org> Reviewed-by: Karl Wiberg <kwiberg@webrtc.org> Reviewed-by: Artem Titov <titovartem@webrtc.org> Commit-Queue: Artem Titov <titovartem@webrtc.org> Cr-Commit-Position: refs/heads/master@{#23205}
50 lines
1.7 KiB
Python
50 lines
1.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
jinja2.optimizer
|
|
~~~~~~~~~~~~~~~~
|
|
|
|
The jinja optimizer is currently trying to constant fold a few expressions
|
|
and modify the AST in place so that it should be easier to evaluate it.
|
|
|
|
Because the AST does not contain all the scoping information and the
|
|
compiler has to find that out, we cannot do all the optimizations we
|
|
want. For example loop unrolling doesn't work because unrolled loops would
|
|
have a different scoping.
|
|
|
|
The solution would be a second syntax tree that has the scoping rules stored.
|
|
|
|
:copyright: (c) 2017 by the Jinja Team.
|
|
:license: BSD.
|
|
"""
|
|
from jinja2 import nodes
|
|
from jinja2.visitor import NodeTransformer
|
|
|
|
|
|
def optimize(node, environment):
|
|
"""The context hint can be used to perform an static optimization
|
|
based on the context given."""
|
|
optimizer = Optimizer(environment)
|
|
return optimizer.visit(node)
|
|
|
|
|
|
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
|