added spitfire to bench and did some more refactoring
--HG--
branch : trunk
diff --git a/jinja2/compiler.py b/jinja2/compiler.py
index 8d58fbe..a1ffdec 100644
--- a/jinja2/compiler.py
+++ b/jinja2/compiler.py
@@ -8,6 +8,7 @@
:copyright: Copyright 2008 by Armin Ronacher.
:license: GNU GPL.
"""
+from time import time
from copy import copy
from random import randrange
from keyword import iskeyword
@@ -16,7 +17,7 @@
from jinja2 import nodes
from jinja2.visitor import NodeVisitor, NodeTransformer
from jinja2.exceptions import TemplateAssertionError
-from jinja2.runtime import StaticLoopContext, concat
+from jinja2.runtime import concat
from jinja2.utils import Markup
@@ -53,7 +54,7 @@
if value is None or value is NotImplemented or value is Ellipsis:
return True
if isinstance(value, (bool, int, long, float, complex, basestring,
- xrange, StaticLoopContext, Markup)):
+ xrange, Markup)):
return True
if isinstance(value, (tuple, list, set, frozenset)):
for item in value:
@@ -545,8 +546,7 @@
self.blocks[block.name] = block
# generate the root render function.
- self.writeline('def root(context, environment=environment'
- '):', extra=1)
+ self.writeline('def root(context, environment=environment):', extra=1)
if have_extends:
self.indent()
self.writeline('parent_template = None')
@@ -760,7 +760,7 @@
if not extended_loop and node.test is not None:
self.indent()
self.writeline('if ')
- self.visit(node.test)
+ self.visit(node.test, loop_frame)
self.write(':')
self.indent()
self.writeline('continue')
@@ -802,7 +802,8 @@
self.outdent()
self.newline()
if frame.toplevel:
- self.write('context[%r] = ' % node.name)
+ self.write('context.exported_vars.add(%r)' % node.name)
+ self.writeline('context.vars[%r] = ' % node.name)
arg_tuple = ', '.join(repr(x.name) for x in node.args)
if len(node.args) == 1:
arg_tuple += ','
@@ -909,24 +910,28 @@
else:
body.append([const])
- # if we have less than 3 nodes we just yield them
- if len(body) < 3:
+ # if we have less than 3 nodes or less than 6 and a buffer we
+ # yield or extend
+ if len(body) < 3 or (frame.buffer is not None and len(body) < 6):
+ if frame.buffer is not None:
+ self.writeline('%s.extend((' % frame.buffer)
for item in body:
if isinstance(item, list):
val = repr(concat(item))
if frame.buffer is None:
self.writeline('yield ' + val)
else:
- self.writeline('%s.append(%s)' % (frame.buffer, val))
+ self.write(val + ', ')
else:
- self.newline(item)
if frame.buffer is None:
- self.write('yield ')
- else:
- self.write('%s.append(' % frame.buffer)
+ self.writeline('yield ')
self.write(finalizer + '(')
self.visit(item, frame)
- self.write(')' * (1 + (frame.buffer is not None)))
+ self.write(')')
+ if frame.buffer is not None:
+ self.write(', ')
+ if frame.buffer is not None:
+ self.write('))')
# otherwise we create a format string as this is faster in that case
else:
@@ -979,7 +984,8 @@
# make sure toplevel assignments are added to the context.
if frame.toplevel:
for name in assignment_frame.assigned_names:
- self.writeline('context[%r] = l_%s' % (name, name))
+ self.writeline('context.vars[%r] = l_%s' % (name, name))
+ self.writeline('context.exported_vars.add(%r)' % name)
def visit_Name(self, node, frame):
if node.ctx == 'store':