Index: lib/mako/codegen.py =================================================================== --- lib/mako/codegen.py (revision 336) +++ lib/mako/codegen.py (working copy) @@ -159,6 +159,13 @@ ) if buffered or filtered or cached: self.printer.writeline("context.push_buffer()") + + self.printer.writelines( + "try:", + "write = context._buffer_stack[-1].data.append", + "except AttributeError:", + "write = context._buffer_stack[-1].write", + None) self.identifier_stack.append(self.compiler.identifiers.branch(self.node)) if not self.in_def and '**pageargs' in args: @@ -328,6 +335,13 @@ "context.push_buffer()", ) + self.printer.writelines( + "try:", + "write = context._buffer_stack[-1].data.append", + "except AttributeError:", + "write = context._buffer_stack[-1].write", + None) + identifiers = identifiers.branch(node, nested=nested) self.write_variable_declares(identifiers) @@ -455,9 +469,9 @@ self.write_source_comment(node) if len(node.escapes) or (self.compiler.pagetag is not None and len(self.compiler.pagetag.filter_args.args)) or len(self.compiler.default_filters): s = self.create_filter_callable(node.escapes_code.args, "%s" % node.text, True) - self.printer.writeline("context.write(%s)" % s) + self.printer.writeline("write(%s)" % s) else: - self.printer.writeline("context.write(%s)" % node.text) + self.printer.writeline("write(%s)" % node.text) def visitControlLine(self, node): if node.isend: @@ -467,7 +481,7 @@ self.printer.writeline(node.text) def visitText(self, node): self.write_source_comment(node) - self.printer.writeline("context.write(%s)" % repr(node.content)) + self.printer.writeline("write(%s)" % repr(node.content)) def visitTextTag(self, node): filtered = len(node.filter_args.args) > 0 if filtered: @@ -481,7 +495,7 @@ self.printer.writelines( "finally:", "__M_buf = context.pop_buffer()", - "context.write(%s)" % self.create_filter_callable(node.filter_args.args, "__M_buf.getvalue()", False), + "write(%s)" % self.create_filter_callable(node.filter_args.args, "__M_buf.getvalue()", False), None ) @@ -544,6 +558,13 @@ ) self.write_variable_declares(body_identifiers) self.identifier_stack.append(body_identifiers) + + self.printer.writelines( + "try:", + "write = context._buffer_stack[-1].data.append", + "except AttributeError:", + "write = context._buffer_stack[-1].write", + None) for n in node.nodes: n.accept_visitor(self) self.identifier_stack.pop() @@ -563,7 +584,7 @@ "try:") self.write_source_comment(node) self.printer.writelines( - "context.write(unicode(%s))" % node.attributes['expr'], + "write(unicode(%s))" % node.attributes['expr'], "finally:", "context.caller_stack.nextcaller = None", None