diff options
author | Armin Ronacher <armin.ronacher@active-4.com> | 2008-04-13 16:31:08 +0200 |
---|---|---|
committer | Armin Ronacher <armin.ronacher@active-4.com> | 2008-04-13 16:31:08 +0200 |
commit | 625215e9153d2f2a0a40d3b2182f0c5d216502b9 (patch) | |
tree | 67e12ced9c96fae234acd1e61968440645d46ea7 /jinja2/optimizer.py | |
parent | 2e7b54f7d89d5d3436ce573d1ade8cca26b9f162 (diff) | |
download | jinja2-625215e9153d2f2a0a40d3b2182f0c5d216502b9.tar.gz |
optimizer can optimize filtered for loops now
--HG--
branch : trunk
Diffstat (limited to 'jinja2/optimizer.py')
-rw-r--r-- | jinja2/optimizer.py | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/jinja2/optimizer.py b/jinja2/optimizer.py index 5877c6f..4dbd5d9 100644 --- a/jinja2/optimizer.py +++ b/jinja2/optimizer.py @@ -123,6 +123,7 @@ class Optimizer(NodeTransformer): def visit_For(self, node, context): """Loop unrolling for iterable constant values.""" + fallback = self.generic_visit(node.copy(), context) try: iterable = self.visit(node.iter, context).as_const() # we only unroll them if they have a length and are iterable @@ -131,11 +132,8 @@ class Optimizer(NodeTransformer): # we also don't want unrolling if macros are defined in it if node.find(nodes.Macro) is not None: raise TypeError() - # XXX: add support for loop test clauses in the optimizer - if node.test is not None: - raise TypeError() except (nodes.Impossible, TypeError): - return self.generic_visit(node, context) + return fallback parent = context.get('loop') context.push() @@ -157,6 +155,20 @@ class Optimizer(NodeTransformer): else: raise AssertionError('unexpected assignable node') + if node.test is not None: + filtered_sequence = [] + for item in iterable: + context.push() + assign(node.target, item) + try: + rv = self.visit(node.test.copy(), context).as_const() + except: + return fallback + context.pop() + if rv: + filtered_sequence.append(item) + iterable = filtered_sequence + try: try: for item, loop in LoopContext(iterable, parent, True): |