summaryrefslogtreecommitdiff
path: root/jinja2/parser.py
diff options
context:
space:
mode:
authorAdrian Moennich <adrian@planetcoding.net>2017-08-22 22:59:57 +0200
committerAdrian Moennich <adrian@planetcoding.net>2017-08-22 23:12:09 +0200
commitcde2a54b87876bd02b283db2f52aca3d9272a92c (patch)
tree2cce6a0e6958fdb7d6c34cb9012f5216c2ab7d21 /jinja2/parser.py
parentd117425f5ed3f542100f20d3bf700ae7bc54039f (diff)
downloadjinja2-2.9-maintenance.tar.gz
Compile `elif` tag to `elif` instead of `else: if`2.9-maintenance
This avoids deep nesting in case of many `{% elif .. %}` blocks (which would fail during execution) and also deep recursion (which may fail during compilation) fixes #759
Diffstat (limited to 'jinja2/parser.py')
-rw-r--r--jinja2/parser.py13
1 files changed, 6 insertions, 7 deletions
diff --git a/jinja2/parser.py b/jinja2/parser.py
index 0bf74c9..70ab7ca 100644
--- a/jinja2/parser.py
+++ b/jinja2/parser.py
@@ -210,17 +210,16 @@ class Parser(object):
node.test = self.parse_tuple(with_condexpr=False)
node.body = self.parse_statements(('name:elif', 'name:else',
'name:endif'))
+ node.elif_ = []
+ node.else_ = []
token = next(self.stream)
if token.test('name:elif'):
- new_node = nodes.If(lineno=self.stream.current.lineno)
- node.else_ = [new_node]
- node = new_node
+ node = nodes.If(lineno=self.stream.current.lineno)
+ result.elif_.append(node)
continue
elif token.test('name:else'):
- node.else_ = self.parse_statements(('name:endif',),
- drop_needle=True)
- else:
- node.else_ = []
+ result.else_ = self.parse_statements(('name:endif',),
+ drop_needle=True)
break
return result