added environment, make filters available locally

--HG--
branch : trunk
diff --git a/jinja2/compiler.py b/jinja2/compiler.py
index 41577c8..95d2f35 100644
--- a/jinja2/compiler.py
+++ b/jinja2/compiler.py
@@ -29,9 +29,9 @@
 }
 
 
-def generate(node, filename, stream=None):
+def generate(node, environment, filename, stream=None):
     is_child = node.find(nodes.Extends) is not None
-    generator = CodeGenerator(is_child, filename, stream)
+    generator = CodeGenerator(environment, is_child, filename, stream)
     generator.visit(node)
     if stream is None:
         return generator.stream.getvalue()
@@ -56,6 +56,10 @@
         # names that are declared by parameters
         self.declared_parameter = set()
 
+        # filters that are declared locally
+        self.declared_filter = set()
+        self.undeclared_filter = set()
+
     def add_special(self, name):
         """Register a special name like `loop`."""
         self.undeclared.discard(name)
@@ -117,6 +121,11 @@
             if not self.identifiers.is_declared(node.name):
                 self.identifiers.undeclared.add(node.name)
 
+    def visit_FilterCall(self, node):
+        if not node.name in self.identifiers.declared_filter:
+            self.identifiers.undeclared_filter.add(node.name)
+        self.identifiers.declared_filter.add(node.name)
+
     def visit_Macro(self, node):
         """Macros set local."""
         self.identifiers.declared_locally.add(node.name)
@@ -128,9 +137,10 @@
 
 class CodeGenerator(NodeVisitor):
 
-    def __init__(self, is_child, filename, stream=None):
+    def __init__(self, environment, is_child, filename, stream=None):
         if stream is None:
             stream = StringIO()
+        self.environment = environment
         self.is_child = is_child
         self.filename = filename
         self.stream = stream
@@ -205,6 +215,8 @@
             self.indent()
         for name in frame.identifiers.undeclared:
             self.writeline('l_%s = context[%r]' % (name, name))
+        for name in frame.identifiers.undeclared_filter:
+            self.writeline('f_%s = context[%r]' % (name, name))
         if not no_indent:
             self.outdent()
 
@@ -516,7 +528,7 @@
 
     def visit_Filter(self, node, frame):
         for filter in node.filters:
-            self.write('context.filters[%r](' % filter.name)
+            self.write('f_%s(' % filter.name)
         self.visit(node.node, frame)
         for filter in reversed(node.filters):
             self.signature(filter, frame)