From: Armin Ronacher Date: Sat, 7 Jan 2017 22:15:07 +0000 (+0100) Subject: Correct bad scoping for for loops. This fixes #640 X-Git-Tag: 2.9.2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e3022523a51a4c6569f9e21625ca2cebcc7ce98a;p=thirdparty%2Fjinja.git Correct bad scoping for for loops. This fixes #640 --- diff --git a/CHANGES b/CHANGES index ca2650c1..2243be92 100644 --- 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) diff --git a/jinja2/compiler.py b/jinja2/compiler.py index a9042a50..4f84a32a 100644 --- a/jinja2/compiler.py +++ b/jinja2/compiler.py @@ -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(')') diff --git a/tests/test_regression.py b/tests/test_regression.py index d185cd95..3230bfdd 100644 --- a/tests/test_regression.py +++ b/tests/test_regression.py @@ -412,3 +412,13 @@ class TestBug(object): assert t.module.link_detail('circle', 'Index', '/') == ( '

' 'Index

') + + 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'