diff --git a/CHANGES b/CHANGES index 6dfc012d39eb79c293b3ca6e7be9bbc1c6ce9f62..a6bae660a35fdea7ed68eb2281aeb6641e83bbad 100644 --- a/CHANGES +++ b/CHANGES @@ -1,4 +1,10 @@ 0.4.2 +- Fixed bug regarding <%call>/def calls w/ content + whereby the identity of the "caller" callable + inside the <%def> would be corrupted by the + presence of another <%call> in the same block. + [ticket:170] + - Fixed the babel plugin to accommodate <%block> [ticket:169] diff --git a/mako/codegen.py b/mako/codegen.py index 5369180772005cec00c2b44396b71465ecd31e59..b8c638286688a316c16153257dff9573b9292974 100644 --- a/mako/codegen.py +++ b/mako/codegen.py @@ -847,10 +847,10 @@ class _GenerateRenderMethod(object): self.printer.writelines( # get local reference to current caller, if any - "caller = context.caller_stack._get_caller()", + "__M_caller = context.caller_stack._get_caller()", # push on caller for nested call "context.caller_stack.nextcaller = " - "runtime.Namespace('caller', context, callables=ccall(caller))", + "runtime.Namespace('caller', context, callables=ccall(__M_caller))", "try:") self.write_source_comment(node) self.printer.writelines( diff --git a/test/test_call.py b/test/test_call.py index 6aadf62e4c922868110b5d0c2f895d23925b923c..5f13e958876314ee4d38477fd541d475bd454021 100644 --- a/test/test_call.py +++ b/test/test_call.py @@ -279,6 +279,63 @@ class CallTest(TemplateTest): ''') assert flatten_result(template.render()) == "foo" + def test_nested_call_4(self): + base = """ + <%def name="A()"> + A_def + ${caller.body()} + </%def> + + <%def name="B()"> + B_def + ${caller.body()} + </%def> + """ + + template = Template(base + """ + <%def name="C()"> + C_def + <%self:B> + <%self:A> + A_body + </%self:A> + B_body + ${caller.body()} + </%self:B> + </%def> + + <%self:C> + C_body + </%self:C> + """) + + eq_( + flatten_result(template.render()), + "C_def B_def A_def A_body B_body C_body" + ) + + template = Template(base + """ + <%def name="C()"> + C_def + <%self:B> + B_body + ${caller.body()} + <%self:A> + A_body + </%self:A> + </%self:B> + </%def> + + <%self:C> + C_body + </%self:C> + """) + + eq_( + flatten_result(template.render()), + "C_def B_def B_body C_body A_def A_body" + ) + def test_chained_call_in_nested(self): t = Template(""" <%def name="embedded()">