mercurial/templateutil.py
changeset 37074 2891079fb0c0
parent 37073 44757e6dad93
child 37084 f0b6fbea00cf
--- a/mercurial/templateutil.py	Thu Mar 15 20:43:39 2018 +0900
+++ b/mercurial/templateutil.py	Thu Mar 15 21:22:52 2018 +0900
@@ -202,8 +202,8 @@
     startname = 'start_' + plural
     if context.preload(startname):
         yield context.process(startname, mapping)
-    vmapping = mapping.copy()
     def one(v, tag=name):
+        vmapping = {}
         try:
             vmapping.update(v)
         # Python 2 raises ValueError if the type of v is wrong. Python
@@ -216,6 +216,7 @@
                     vmapping[a] = b
             except (TypeError, ValueError):
                 vmapping[name] = v
+        vmapping = context.overlaymap(mapping, vmapping)
         return context.process(tag, vmapping)
     lastname = 'last_' + name
     if context.preload(lastname):
@@ -399,10 +400,9 @@
                 raise error.ParseError(_("%r is not iterable") % d)
 
     for i, v in enumerate(diter):
-        lm = mapping.copy()
-        lm['index'] = i
         if isinstance(v, dict):
-            lm.update(v)
+            lm = context.overlaymap(mapping, v)
+            lm['index'] = i
             lm['originalnode'] = mapping.get('node')
             yield evalrawexp(context, lm, targ)
         else:
@@ -415,8 +415,7 @@
     darg, memb = data
     d = evalrawexp(context, mapping, darg)
     if util.safehasattr(d, 'tomap'):
-        lm = mapping.copy()
-        lm.update(d.tomap())
+        lm = context.overlaymap(mapping, d.tomap())
         return runsymbol(context, lm, memb)
     if util.safehasattr(d, 'get'):
         return getdictitem(d, memb)