Index: lib/mako/runtime.py =================================================================== --- lib/mako/runtime.py (revision 331) +++ lib/mako/runtime.py (working copy) @@ -44,6 +44,9 @@ def write(self, string): """write a string to this Context's underlying output buffer.""" self._buffer_stack[-1].write(string) + def writer(self): + """return the current writer function""" + return self._buffer_stack[-1].write def _copy(self): c = Context.__new__(Context) c._buffer_stack = self._buffer_stack Index: lib/mako/codegen.py =================================================================== --- lib/mako/codegen.py (revision 335) +++ lib/mako/codegen.py (working copy) @@ -159,7 +159,9 @@ ) if buffered or filtered or cached: self.printer.writeline("context.push_buffer()") - + + self.printer.writeline("__M_writer = context.writer()") + self.identifier_stack.append(self.compiler.identifiers.branch(self.node)) if not self.in_def and '**pageargs' in args: self.identifier_stack[-1].argument_declared.add('pageargs') @@ -328,6 +330,8 @@ "context.push_buffer()", ) + self.printer.writeline("__M_writer = context.writer()") + identifiers = identifiers.branch(node, nested=nested) self.write_variable_declares(identifiers) @@ -373,7 +377,7 @@ self.printer.writeline("return %s" % s) else: self.printer.writelines( - "context.write(%s)" % s, + "__M_writer(%s)" % s, "return ''" ) @@ -413,7 +417,7 @@ self.printer.writelines("return " + s,None) else: self.printer.writelines( - "context.write(context.get('local').get_cached(%s, %screatefunc=lambda:__M_%s(%s)))" % (cachekey, ''.join(["%s=%s, " % (k,v) for k, v in cacheargs.iteritems()]), name, ','.join(pass_args)), + "__M_writer(context.get('local').get_cached(%s, %screatefunc=lambda:__M_%s(%s)))" % (cachekey, ''.join(["%s=%s, " % (k,v) for k, v in cacheargs.iteritems()]), name, ','.join(pass_args)), "return ''", None ) @@ -455,9 +459,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("__M_writer(%s)" % s) else: - self.printer.writeline("context.write(%s)" % node.text) + self.printer.writeline("__M_writer(%s)" % node.text) def visitControlLine(self, node): if node.isend: @@ -467,7 +471,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("__M_writer(%s)" % repr(node.content)) def visitTextTag(self, node): filtered = len(node.filter_args.args) > 0 if filtered: @@ -481,7 +485,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), + "__M_writer(%s)" % self.create_filter_callable(node.filter_args.args, "__M_buf.getvalue()", False), None ) @@ -563,7 +567,7 @@ "try:") self.write_source_comment(node) self.printer.writelines( - "context.write(unicode(%s))" % node.attributes['expr'], + "__M_writer(unicode(%s))" % node.attributes['expr'], "finally:", "context.caller_stack.nextcaller = None", None