fixed one bug with blocks, one to go

--HG--
branch : trunk
diff --git a/jinja2/compiler.py b/jinja2/compiler.py
index 44087f1..48c9d99 100644
--- a/jinja2/compiler.py
+++ b/jinja2/compiler.py
@@ -257,11 +257,17 @@
         assert frame is None, 'no root frame allowed'
         self.writeline('from jinja2.runtime import *')
         self.writeline('filename = %r' % self.filename)
-        self.writeline('template_context = TemplateContext(global_context, '
-                       'filename)')
+
+        # find all blocks
+        for block in node.find_all(nodes.Block):
+            if block.name in self.blocks:
+                raise TemplateAssertionError('block %r defined twice' %
+                                             block.name, block.lineno,
+                                             self.filename)
+            self.blocks[block.name] = block
 
         # generate the root render function.
-        self.writeline('def root(context=template_context):', extra=1)
+        self.writeline('def root(context):', extra=1)
         self.indent()
         self.writeline('parent_root = None')
         self.outdent()
@@ -285,17 +291,13 @@
             block_frame = Frame()
             block_frame.inspect(block.body)
             block_frame.block = name
+            print block_frame.identifiers.__dict__
             self.writeline('def block_%s(context):' % name, block, 1)
             self.pull_locals(block_frame)
             self.blockvisit(block.body, block_frame, True)
 
     def visit_Block(self, node, frame):
         """Call a block and register it for the template."""
-        if node.name in self.blocks:
-            raise TemplateAssertionError("the block '%s' was already defined" %
-                                         node.name, node.lineno,
-                                         self.filename)
-        self.blocks[node.name] = node
         self.writeline('for event in block_%s(context):' % node.name)
         self.indent()
         self.writeline('yield event')
@@ -429,6 +431,11 @@
     def visit_Output(self, node, frame):
         self.newline(node)
 
+        if self.environment.finalize is unicode:
+            finalizer = 'unicode'
+        else:
+            finalizer = 'context.finalize'
+
         # try to evaluate as many chunks as possible into a static
         # string at compile time.
         body = []
@@ -450,7 +457,7 @@
                     self.writeline('yield %s' % repr(u''.join(item)))
                 else:
                     self.newline(item)
-                    self.write('yield unicode(')
+                    self.write('yield %s(' % finalizer)
                     self.visit(item, frame)
                     self.write(')')
 
@@ -469,7 +476,11 @@
             for idx, argument in enumerate(arguments):
                 if idx:
                     self.write(', ')
+                if finalizer != 'unicode':
+                    self.write('(')
                 self.visit(argument, frame)
+                if finalizer != 'unicode':
+                    self.write(')')
             self.write(idx == 0 and ',)' or ')')
 
     def visit_Assign(self, node, frame):
@@ -514,6 +525,24 @@
             self.visit(item, frame)
         self.write(idx == 0 and ',)' or ')')
 
+    def visit_List(self, node, frame):
+        self.write('[')
+        for idx, item in enumerate(node.items):
+            if idx:
+                self.write(', ')
+            self.visit(item, frame)
+        self.write(']')
+
+    def visit_Dict(self, node, frame):
+        self.write('{')
+        for idx, item in enumerate(node.items):
+            if idx:
+                self.write(', ')
+            self.visit(item.key, frame)
+            self.write(': ')
+            self.visit(item.value, frame)
+        self.write('}')
+
     def binop(operator):
         def visitor(self, node, frame):
             self.write('(')