]> git.ipfire.org Git - thirdparty/jinja.git/commitdiff
Optimize the case where we know about defined variables
authorArmin Ronacher <armin.ronacher@active-4.com>
Fri, 6 Jan 2017 13:48:48 +0000 (14:48 +0100)
committerArmin Ronacher <armin.ronacher@active-4.com>
Fri, 6 Jan 2017 13:48:48 +0000 (14:48 +0100)
jinja2/compiler.py
jinja2/idtracking.py

index 08c61c0a621a21d44776ac45beec8ba481d9e5f9..f39ac71a118778836e603baf64485a6c6b54dfe6 100644 (file)
@@ -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
index 6cb58109357e84aed618d97c51eac7865d496c76..f99c568dc69262b16457502ca45cc9fffbb98526 100644 (file)
@@ -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]