]> Cypherpunks repositories - gostls13.git/commitdiff
exp/template: fix action variable declarations inside range
authorRoger Peppe <rogpeppe@gmail.com>
Thu, 21 Jul 2011 23:53:25 +0000 (09:53 +1000)
committerRob Pike <r@golang.org>
Thu, 21 Jul 2011 23:53:25 +0000 (09:53 +1000)
R=r
CC=golang-dev
https://golang.org/cl/4807043

src/pkg/exp/template/exec.go
src/pkg/exp/template/exec_test.go

index d5a86d87224bb9d10106d657701aedeaff6cfdde..74d529c2f68e987d224e2050b3da729e0abef8e7 100644 (file)
@@ -172,6 +172,8 @@ func isTrue(val reflect.Value) (truth, ok bool) {
 func (s *state) walkRange(dot reflect.Value, r *rangeNode) {
        defer s.pop(s.mark())
        val, _ := indirect(s.evalPipeline(dot, r.pipe))
+       // mark top of stack before any variables in the body are pushed.
+       mark := s.mark()
        switch val.Kind() {
        case reflect.Array, reflect.Slice:
                if val.Len() == 0 {
@@ -188,6 +190,7 @@ func (s *state) walkRange(dot reflect.Value, r *rangeNode) {
                                s.setVar(2, reflect.ValueOf(i))
                        }
                        s.walk(elem, r.list)
+                       s.pop(mark)
                }
                return
        case reflect.Map:
@@ -205,6 +208,7 @@ func (s *state) walkRange(dot reflect.Value, r *rangeNode) {
                                s.setVar(2, key)
                        }
                        s.walk(elem, r.list)
+                       s.pop(mark)
                }
                return
        default:
index 36eaabe5f07c5c3a675173d75ecb4c27667a9984..cba0d5a97c1b8b6cde73c672aa09cadf8f425ecb 100644 (file)
@@ -331,6 +331,7 @@ var execTests = []execTest{
        {"range $x MSIone", "{{range $x := .MSIone}}<{{$x}}>{{end}}", "<1>", tVal, true},
        {"range $x $y MSIone", "{{range $x, $y := .MSIone}}<{{$x}}={{$y}}>{{end}}", "<one=1>", tVal, true},
        {"range $x PSI", "{{range $x := .PSI}}<{{$x}}>{{end}}", "<21><22><23>", tVal, true},
+       {"declare in range", "{{range $x := .PSI}}<{{$foo:=$x}}>{{end}}", "<21><22><23>", tVal, true},
 
        // Cute examples.
        {"or as if true", `{{or .SI "slice is empty"}}`, "[3 4 5]", tVal, true},