]> Cypherpunks repositories - gostls13.git/commitdiff
template: treat map keys as zero, not non-existent.
authorRoger Peppe <rogpeppe@gmail.com>
Mon, 24 Jan 2011 19:12:54 +0000 (14:12 -0500)
committerRuss Cox <rsc@golang.org>
Mon, 24 Jan 2011 19:12:54 +0000 (14:12 -0500)
R=adg, r, hoka, rsc
CC=golang-dev
https://golang.org/cl/4036045

src/pkg/template/template.go
src/pkg/template/template_test.go

index a67dbf8ad2442b4b94f49e09db807396f99fd407..078463aafdaaef354b4f16f51121a1638797b590 100644 (file)
@@ -622,7 +622,10 @@ func (t *Template) lookup(st *state, v reflect.Value, name string) reflect.Value
                        }
                        return av.FieldByName(name)
                case *reflect.MapValue:
-                       return av.Elem(reflect.NewValue(name))
+                       if v := av.Elem(reflect.NewValue(name)); v != nil {
+                               return v
+                       }
+                       return reflect.MakeZero(typ.(*reflect.MapType).Elem())
                default:
                        return nil
                }
index 57f297e8f0a0bbc4964ac3443b7d366d669b0160..3842b6d6b5b047bf1dfbb843559e25c2f346dc20 100644 (file)
@@ -522,9 +522,27 @@ func TestMapDriverType(t *testing.T) {
                t.Error("unexpected execute error:", err)
        }
        s := b.String()
-       expected := "template: Ahoy!"
-       if s != expected {
-               t.Errorf("failed passing string as data: expected %q got %q", "template: Ahoy!", s)
+       expect := "template: Ahoy!"
+       if s != expect {
+               t.Errorf("failed passing string as data: expected %q got %q", expect, s)
+       }
+}
+
+func TestMapNoEntry(t *testing.T) {
+       mp := make(map[string]int)
+       tmpl, err := Parse("template: {notthere}!", nil)
+       if err != nil {
+               t.Error("unexpected parse error:", err)
+       }
+       var b bytes.Buffer
+       err = tmpl.Execute(mp, &b)
+       if err != nil {
+               t.Error("unexpected execute error:", err)
+       }
+       s := b.String()
+       expect := "template: 0!"
+       if s != expect {
+               t.Errorf("failed passing string as data: expected %q got %q", expect, s)
        }
 }
 
@@ -539,8 +557,9 @@ func TestStringDriverType(t *testing.T) {
                t.Error("unexpected execute error:", err)
        }
        s := b.String()
-       if s != "template: hello" {
-               t.Errorf("failed passing string as data: expected %q got %q", "template: hello", s)
+       expect := "template: hello"
+       if s != expect {
+               t.Errorf("failed passing string as data: expected %q got %q", expect, s)
        }
 }
 
@@ -555,18 +574,18 @@ func TestTwice(t *testing.T) {
                t.Error("unexpected parse error:", err)
        }
        s := b.String()
-       text := "template: hello"
-       if s != text {
-               t.Errorf("failed passing string as data: expected %q got %q", text, s)
+       expect := "template: hello"
+       if s != expect {
+               t.Errorf("failed passing string as data: expected %q got %q", expect, s)
        }
        err = tmpl.Execute("hello", &b)
        if err != nil {
                t.Error("unexpected parse error:", err)
        }
        s = b.String()
-       text += text
-       if s != text {
-               t.Errorf("failed passing string as data: expected %q got %q", text, s)
+       expect += expect
+       if s != expect {
+               t.Errorf("failed passing string as data: expected %q got %q", expect, s)
        }
 }