diff options
author | rockot <rockot@chromium.org> | 2014-12-15 16:54:14 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-12-16 00:54:37 +0000 |
commit | 6f6c4e614de20d2509ee53e04b1c5351db71e1c6 (patch) | |
tree | 59b3af8852d3a35bf72981e29bdd4516d67abb4b /mojo/public/third_party/jinja2/optimizer.py | |
parent | 3ac8a6d5596a29d00102e280ec7e7164c2807370 (diff) | |
download | chromium_src-6f6c4e614de20d2509ee53e04b1c5351db71e1c6.zip chromium_src-6f6c4e614de20d2509ee53e04b1c5351db71e1c6.tar.gz chromium_src-6f6c4e614de20d2509ee53e04b1c5351db71e1c6.tar.bz2 |
Update mojo sdk to rev 59145288bae55b0fce4276b017df6a1117bcf00f
BUG=None
TBR=jamesr@chromium.org for mojo
Review URL: https://codereview.chromium.org/799113004
Cr-Commit-Position: refs/heads/master@{#308479}
Diffstat (limited to 'mojo/public/third_party/jinja2/optimizer.py')
-rw-r--r-- | mojo/public/third_party/jinja2/optimizer.py | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/mojo/public/third_party/jinja2/optimizer.py b/mojo/public/third_party/jinja2/optimizer.py new file mode 100644 index 0000000..00eab11 --- /dev/null +++ b/mojo/public/third_party/jinja2/optimizer.py @@ -0,0 +1,68 @@ +# -*- 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) 2010 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 visit_If(self, node): + """Eliminate dead code.""" + # do not optimize ifs that have a block inside so that it doesn't + # break super(). + if node.find(nodes.Block) is not None: + return self.generic_visit(node) + try: + val = self.visit(node.test).as_const() + except nodes.Impossible: + return self.generic_visit(node) + if val: + body = node.body + else: + body = node.else_ + result = [] + for node in body: + result.extend(self.visit_list(node)) + return result + + def fold(self, node): + """Do constant folding.""" + node = self.generic_visit(node) + try: + return nodes.Const.from_untrusted(node.as_const(), + 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 |