Added another testcase and fixed a bug with the volatile scoping.

--HG--
branch : trunk
diff --git a/jinja2/compiler.py b/jinja2/compiler.py
index 5f355a9..3bc6d35 100644
--- a/jinja2/compiler.py
+++ b/jinja2/compiler.py
@@ -1318,6 +1318,7 @@
                 if frame.eval_ctx.volatile:
                     self.write('(context.eval_ctx.autoescape and'
                                ' escape or to_string)(')
+                    close += 1
                 elif frame.eval_ctx.autoescape:
                     self.write('escape(')
                     close += 1
@@ -1613,7 +1614,7 @@
             try:
                 val = keyword.value.as_const(frame.eval_ctx)
             except nodes.Impossible:
-                frame.volatile = True
+                frame.eval_ctx.volatile = True
             else:
                 setattr(frame.eval_ctx, keyword.key, val)
 
diff --git a/jinja2/testsuite/ext.py b/jinja2/testsuite/ext.py
index 09b2b85..f8458b1 100644
--- a/jinja2/testsuite/ext.py
+++ b/jinja2/testsuite/ext.py
@@ -306,6 +306,19 @@
                                '{% endautoescape %}{{ x }}{{ "<y>" }}')
         assert tmpl.render(x=1) == '&lt;x&gt;1<y>'
 
+    def test_volatile_scoping(self):
+        env = Environment(extensions=['jinja2.ext.autoescape'])
+        tmpl = env.from_string('''
+        {% autoescape val %}
+            {% macro foo(x) %}
+                [{{ x }}]
+            {% endmacro %}
+            {{ foo().__class__.__name__ }}
+        {% endautoescape %}
+        ''')
+        assert tmpl.render(val=True).strip() == 'Markup'
+        assert tmpl.render(val=False).strip() == unicode.__name__
+
 
 def suite():
     suite = unittest.TestSuite()