added subscribe-optimation
authorChristoph Hack <christoph@tux21b.org>
Tue, 8 Apr 2008 21:17:27 +0000 (23:17 +0200)
committerChristoph Hack <christoph@tux21b.org>
Tue, 8 Apr 2008 21:17:27 +0000 (23:17 +0200)
--HG--
branch : trunk

jinja2/optimizer.py
test_optimizer.py

index c9787f655ea376ac89a42ac15db1897461c776b7..e7f6ac700c90144a0ef9bd8d17a8caf7a6eb10f9 100644 (file)
@@ -22,6 +22,7 @@
 from copy import deepcopy
 from jinja2 import nodes
 from jinja2.visitor import NodeVisitor, NodeTransformer
+from jinja2.runtime import subscribe
 
 
 class Optimizer(NodeTransformer):
@@ -62,7 +63,16 @@ class Optimizer(NodeTransformer):
             return node
         return nodes.Const(self.context[node.name])
 
+    def visit_Subscript(self, node):
+        try:
+            item = self.visit(node.node).as_const()
+            arg = self.visit(node.arg).as_const()
+        except nodes.Impossible:
+            return node
+        # XXX: what does the 3rd parameter mean?
+        return nodes.Const(subscribe(item, arg, None))
+
 
-def optimize(node, environment):
-    optimizer = Optimizer(environment)
+def optimize(node, environment, context={}):
+    optimizer = Optimizer(environment, context=context)
     return optimizer.visit(node)
index e23d8621199d8b2fa236fd7fd5919c4c00c07f46..06ee4406404c87de09fc68379a3879a64a0dca61 100644 (file)
@@ -4,19 +4,24 @@ from jinja2.optimizer import optimize
 
 
 env = Environment()
+forums = [
+    {'id': 1, 'name': u'Example'},
+    {'id': 2, 'name': u'Foobar'},
+    {'id': 3, 'name': u'<42>'}
+]
 ast = env.parse("""
     Hi {{ "<blub>"|e }},
     how are you?
 
-    {% for item in ('foo', 'bar', 'blub', '<42>') %}
-        {{ item|e }}
+    {% for forum in forums %}
+        {{ readstatus(forum.id) }} {{ forum.id|e }} {{ forum.name|e }}
     {% endfor %}
 """)
 print ast
 print
 print generate(ast, env, "foo.html")
 print
-ast = optimize(ast, env)
+ast = optimize(ast, env, context={'forums': forums})
 print ast
 print
 print generate(ast, env, "foo.html")