]> Cypherpunks repositories - gostls13.git/commitdiff
don't crash printing a nil map
authorRob Pike <r@golang.org>
Mon, 3 Aug 2009 20:34:20 +0000 (13:34 -0700)
committerRob Pike <r@golang.org>
Mon, 3 Aug 2009 20:34:20 +0000 (13:34 -0700)
R=rsc
DELTA=19  (18 added, 0 deleted, 1 changed)
OCL=32656
CL=32670

src/pkg/fmt/fmt_test.go
src/pkg/reflect/value.go

index 5cc887e41de9da27b5912263d108d9d690e0fc84..9d772e1befad5afb656b2f2445bfe5dd14c6d703 100644 (file)
@@ -270,3 +270,17 @@ func TestMapPrinter(t *testing.T) {
        presentInMap(Sprintf("%v", m1), a, t);
        presentInMap(Sprint(m1), a, t);
 }
+
+func TestEmptyMap(t *testing.T) {
+       const emptyMapStr = "map[]";
+       var m map[string]int;
+       s := Sprint(m);
+       if s != emptyMapStr {
+               t.Errorf("nil map printed as %q not %q", s, emptyMapStr);
+       }
+       m = make(map[string]int);
+       s = Sprint(m);
+       if s != emptyMapStr {
+               t.Errorf("empty map printed as %q not %q", s, emptyMapStr);
+       }
+}
index 4dc130a6cd41a902c8e817e2fea005346cd918bb..c32574a3f0fb6fd2c5592e68c51363f366b998e2 100644 (file)
@@ -1008,8 +1008,12 @@ func (v *MapValue) Len() int {
 func (v *MapValue) Keys() []Value {
        tk := v.Type().(*MapType).Key();
        m := *(**byte)(v.addr);
+       mlen := int32(0);
+       if m != nil {
+               mlen = maplen(m)
+       }
        it := mapiterinit(m);
-       a := make([]Value, maplen(m));
+       a := make([]Value, mlen);
        var i int;
        for i = 0; i < len(a); i++ {
                k := MakeZero(tk);