Fixed a bug in the subscript operation.
authorArmin Ronacher <armin.ronacher@active-4.com>
Fri, 12 Sep 2008 21:12:49 +0000 (23:12 +0200)
committerArmin Ronacher <armin.ronacher@active-4.com>
Fri, 12 Sep 2008 21:12:49 +0000 (23:12 +0200)
--HG--
branch : trunk

CHANGES
jinja2/compiler.py
tests/test_undefined.py

diff --git a/CHANGES b/CHANGES
index c1eb7334eae4bd84b2eb427030b1a132c35b4904..eb730f120e1ee49f426c6796fdfa83a66e98bb62 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -14,6 +14,10 @@ Version 2.1
 
 - fixed a limitation in the lexer that made ``{{ foo.0.0 }}`` impossible.
 
+- index based subscribing of variables with a constant value returns an
+  undefined object now instead of raising an index error.  This was a bug
+  caused by eager optimizing.
+
 Version 2.0
 -----------
 (codename jinjavitus, released on July 17th 2008)
index 4c0944a5c34e285d6c36676778d7394ba790c2ad..6bd9428b6deee626087a52ef6d72f4f325ee6eec 100644 (file)
@@ -1299,11 +1299,8 @@ class CodeGenerator(NodeVisitor):
         self.write(', %r)' % node.attr)
 
     def visit_Getitem(self, node, frame):
-        # slices or integer subscriptions bypass the getitem
-        # method if we can determine that at compile time.
-        if isinstance(node.arg, nodes.Slice) or \
-           (isinstance(node.arg, nodes.Const) and
-            isinstance(node.arg.value, (int, long))):
+        # slices bypass the environment getitem method.
+        if isinstance(node.arg, nodes.Slice):
             self.visit(node.node, frame)
             self.write('[')
             self.visit(node.arg, frame)
index f0544bb2a8bd836152d1681017f699a5d1f69553..eb1e7e676b291add713313507105e186b0b232a8 100644 (file)
@@ -6,6 +6,9 @@
     :copyright: 2008 by Armin Ronacher.
     :license: BSD, see LICENSE for more details.
 """
+from py.test import raises
+from jinja2 import Template
+from jinja2.exceptions import UndefinedError
 
 
 test_default_undefined = '''
@@ -72,3 +75,8 @@ Traceback (most recent call last):
   ...
 UndefinedError: 'missing' is undefined
 '''
+
+
+def test_indexing_gives_undefined():
+    t = Template("{{ var[42].foo }}")
+    raises(UndefinedError, t.render, var=0)