From: Armin Ronacher Date: Fri, 6 Jan 2017 13:48:48 +0000 (+0100) Subject: Optimize the case where we know about defined variables X-Git-Tag: 2.9~23 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=85b4e3d550355497419d1076c62895699f5e93aa;p=thirdparty%2Fjinja.git Optimize the case where we know about defined variables --- diff --git a/jinja2/compiler.py b/jinja2/compiler.py index 08c61c0a..f39ac71a 100644 --- a/jinja2/compiler.py +++ b/jinja2/compiler.py @@ -1267,11 +1267,18 @@ class CodeGenerator(NodeVisitor): if self._assign_stack and node.name[:1] != '_': self._assign_stack[-1].add(node.name) ref = frame.symbols.ref(node.name) + + # If we are looking up a variable we might have to deal with the + # case where it's undefined. We can skip that case if the load + # instruction indicates a parameter which are always defined. if node.ctx == 'load': - self.write('(undefined(name=%r) if %s is missing else %s)' % - (node.name, ref, ref)) - else: - self.write(ref) + load = frame.symbols.find_load(ref) + if load is None or load[0] != VAR_LOAD_PARAMETER: + self.write('(undefined(name=%r) if %s is missing else %s)' % + (node.name, ref, ref)) + return + + self.write(ref) def visit_Const(self, node, frame): val = node.value diff --git a/jinja2/idtracking.py b/jinja2/idtracking.py index 6cb58109..f99c568d 100644 --- a/jinja2/idtracking.py +++ b/jinja2/idtracking.py @@ -45,6 +45,12 @@ class Symbols(object): self.loads[ident] = load return ident + def find_load(self, target): + if target in self.loads: + return self.loads[target] + if self.parent is not None: + return self.parent.find_load(target) + def find_ref(self, name): if name in self.refs: return self.refs[name]