]> Cypherpunks repositories - gostls13.git/commitdiff
exp/template/html: check that modified nodes are not shared by templates
authorMike Samuel <mikesamuel@gmail.com>
Wed, 14 Sep 2011 18:52:03 +0000 (11:52 -0700)
committerMike Samuel <mikesamuel@gmail.com>
Wed, 14 Sep 2011 18:52:03 +0000 (11:52 -0700)
R=nigeltao
CC=golang-dev
https://golang.org/cl/5012044

src/pkg/exp/template/html/escape.go

index 22a552134014142c2d4dd15ab87e3fba5ce9ff12..3c0996c46ab2762f218951b3faa7037bcbefc71b 100644 (file)
@@ -178,6 +178,9 @@ func (e *escaper) escapeAction(c context, n *parse.ActionNode) context {
        default:
                s = append(s, "html")
        }
+       if _, ok := e.actionNodeEdits[n]; ok {
+               panic(fmt.Sprintf("node %s shared between templates", n))
+       }
        e.actionNodeEdits[n] = s
        return c
 }
@@ -294,7 +297,10 @@ func (e *escaper) escapeBranch(c context, n *parse.BranchNode, nodeName string)
                // The "true" branch of a "range" node can execute multiple times.
                // We check that executing n.List once results in the same context
                // as executing n.List twice.
+               ae, te := e.actionNodeEdits, e.templateNodeEdits
+               e.actionNodeEdits, e.templateNodeEdits = make(map[*parse.ActionNode][]string), make(map[*parse.TemplateNode]string)
                c0 = join(c0, e.escapeList(c0, n.List), n.Line, nodeName)
+               e.actionNodeEdits, e.templateNodeEdits = ae, te
                if c0.state == stateError {
                        // Make clear that this is a problem on loop re-entry
                        // since developers tend to overlook that branch when
@@ -323,6 +329,9 @@ func (e *escaper) escapeList(c context, n *parse.ListNode) context {
 func (e *escaper) escapeTemplate(c context, n *parse.TemplateNode) context {
        c, name := e.escapeTree(c, n.Name, n.Line)
        if name != n.Name {
+               if _, ok := e.templateNodeEdits[n]; ok {
+                       panic(fmt.Sprintf("node %s shared between templates", n))
+               }
                e.templateNodeEdits[n] = name
        }
        return c