python 3 port: automated changes by a slightly modified python-modernize

(replacing unicode with six.text_type, but not replacing u"" by six.u(""))
diff --git a/jinja2/compiler.py b/jinja2/compiler.py
index b21cb38..35f7d02 100644
--- a/jinja2/compiler.py
+++ b/jinja2/compiler.py
@@ -16,6 +16,9 @@
 from jinja2.visitor import NodeVisitor
 from jinja2.exceptions import TemplateAssertionError
 from jinja2.utils import Markup, concat, escape, is_python_keyword, next
+import six
+from six.moves import map
+from six.moves import zip
 
 
 operators = {
@@ -30,7 +33,7 @@
 }
 
 try:
-    exec '(0 if 0 else 0)'
+    exec('(0 if 0 else 0)')
 except SyntaxError:
     have_condexpr = False
 else:
@@ -51,7 +54,7 @@
     def f():
         if 0: dummy(x)
     return f
-unoptimize_before_dead_code = bool(unoptimize_before_dead_code().func_closure)
+unoptimize_before_dead_code = bool(unoptimize_before_dead_code().__closure__)
 
 
 def generate(node, environment, name, filename, stream=None,
@@ -78,7 +81,7 @@
                 return False
         return True
     elif isinstance(value, dict):
-        for key, value in value.iteritems():
+        for key, value in six.iteritems(value):
             if not has_safe_repr(key):
                 return False
             if not has_safe_repr(value):
@@ -542,7 +545,7 @@
                 self.write(', ')
                 self.visit(kwarg, frame)
             if extra_kwargs is not None:
-                for key, value in extra_kwargs.iteritems():
+                for key, value in six.iteritems(extra_kwargs):
                     self.write(', %s=%s' % (key, value))
         if node.dyn_args:
             self.write(', *')
@@ -558,7 +561,7 @@
                 self.visit(kwarg.value, frame)
                 self.write(', ')
             if extra_kwargs is not None:
-                for key, value in extra_kwargs.iteritems():
+                for key, value in six.iteritems(extra_kwargs):
                     self.write('%r: %s, ' % (key, value))
             if node.dyn_kwargs is not None:
                 self.write('}, **')
@@ -625,7 +628,7 @@
 
     def pop_scope(self, aliases, frame):
         """Restore all aliases and delete unused variables."""
-        for name, alias in aliases.iteritems():
+        for name, alias in six.iteritems(aliases):
             self.writeline('l_%s = %s' % (name, alias))
         to_delete = set()
         for name in frame.identifiers.declared_locally:
@@ -827,7 +830,7 @@
             self.outdent(2 + (not self.has_known_extends))
 
         # at this point we now have the blocks collected and can visit them too.
-        for name, block in self.blocks.iteritems():
+        for name, block in six.iteritems(self.blocks):
             block_frame = Frame(eval_ctx)
             block_frame.inspect(block.body)
             block_frame.block = name
@@ -1216,7 +1219,7 @@
             return
 
         if self.environment.finalize:
-            finalize = lambda x: unicode(self.environment.finalize(x))
+            finalize = lambda x: six.text_type(self.environment.finalize(x))
         else:
             finalize = unicode