]> git.ipfire.org Git - thirdparty/jinja.git/commitdiff
Correct bad scoping for for loops. This fixes #640
authorArmin Ronacher <armin.ronacher@active-4.com>
Sat, 7 Jan 2017 22:15:07 +0000 (23:15 +0100)
committerArmin Ronacher <armin.ronacher@active-4.com>
Sat, 7 Jan 2017 22:15:07 +0000 (23:15 +0100)
CHANGES
jinja2/compiler.py
tests/test_regression.py

diff --git a/CHANGES b/CHANGES
index ca2650c1edb0d6458f7363c0b2ae1500ea4d2a73..2243be920b0b894c8483e37b20f34b9d232ea55d 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,13 @@
 Jinja2 Changelog
 ================
 
+Version 2.9.1
+-------------
+(bugfix release, release date undecided)
+
+- Fixed a regression that caused for loops to not be able to use the same
+  variable for the target as well as source iterator.  (#640)
+
 Version 2.9.1
 -------------
 (bugfix release, released on January 7th 2017)
index a9042a50873d7b1e52633e3b70f3ff4a25bab26f..4f84a32aa732d8b969b3a8ddaf629886c6862ad5 100644 (file)
@@ -1034,7 +1034,7 @@ class CodeGenerator(NodeVisitor):
             else:
                 if self.environment.is_async:
                     self.write('auto_aiter(')
-                self.visit(node.iter, loop_frame)
+                self.visit(node.iter, frame)
                 if self.environment.is_async:
                     self.write(')')
             self.write(' if (')
@@ -1046,7 +1046,7 @@ class CodeGenerator(NodeVisitor):
         else:
             if self.environment.is_async and not extended_loop:
                 self.write('auto_aiter(')
-            self.visit(node.iter, loop_frame)
+            self.visit(node.iter, frame)
             if self.environment.is_async and not extended_loop:
                 self.write(')')
 
index d185cd95fe93754a831cabf169ae11e7658de419..3230bfdd4e56497ba499f4ec00908602a2e99483 100644 (file)
@@ -412,3 +412,13 @@ class TestBug(object):
         assert t.module.link_detail('circle', 'Index', '/') == (
             '<p><span class="fa fa-fw fa-circle">'
             '</span><a href="/">Index</a></p>')
+
+    def test_variable_reuse(self, env):
+        t = env.from_string('{% for x in x.y %}{{ x }}{% endfor %}')
+        assert t.render(x={'y': [0, 1, 2]}) == '012'
+
+        t = env.from_string('{% for x in x.y %}{{ loop.index0 }}|{{ x }}{% endfor %}')
+        assert t.render(x={'y': [0, 1, 2]}) == '0|01|12|2'
+
+        t = env.from_string('{% for x in x.y recursive %}{{ x }}{% endfor %}')
+        assert t.render(x={'y': [0, 1, 2]}) == '012'