]> Cypherpunks repositories - gostls13.git/commitdiff
reflect: test, fix access to nil maps
authorRuss Cox <rsc@golang.org>
Mon, 19 May 2014 13:36:47 +0000 (09:36 -0400)
committerRuss Cox <rsc@golang.org>
Mon, 19 May 2014 13:36:47 +0000 (09:36 -0400)
Fixes #8010.

LGTM=bradfitz, khr
R=khr, bradfitz, dvyukov
CC=golang-codereviews
https://golang.org/cl/91450048

src/pkg/reflect/all_test.go
src/pkg/runtime/hashmap.goc

index 1e6341bd0bf544c34d176694a0d32ab5abfdfeea..9c5eb4e5540ab285b47c516e0e5752cc1228a5a4 100644 (file)
@@ -973,6 +973,28 @@ func TestMap(t *testing.T) {
        }
 }
 
+func TestNilMap(t *testing.T) {
+       var m map[string]int
+       mv := ValueOf(m)
+       keys := mv.MapKeys()
+       if len(keys) != 0 {
+               t.Errorf(">0 keys for nil map: %v", keys)
+       }
+
+       // Check that value for missing key is zero.
+       x := mv.MapIndex(ValueOf("hello"))
+       if x.Kind() != Invalid {
+               t.Errorf("m.MapIndex(\"hello\") for nil map = %v, want Invalid Value", x)
+       }
+
+       // Check big value too.
+       var mbig map[string][10 << 20]byte
+       x = ValueOf(mbig).MapIndex(ValueOf("hello"))
+       if x.Kind() != Invalid {
+               t.Errorf("mbig.MapIndex(\"hello\") for nil map = %v, want Invalid Value", x)
+       }
+}
+
 func TestChan(t *testing.T) {
        for loop := 0; loop < 2; loop++ {
                var c chan int
index 4f5e78897bc7f9e625cd570fd5660074f74c3aa8..36707c6ede29ba6c62ee54bdf0d60060782256ec 100644 (file)
@@ -908,11 +908,15 @@ func mapaccess2(t *MapType, h *Hmap, key *byte) (val *byte, pres bool) {
 
 #pragma textflag NOSPLIT
 func reflect·mapaccess(t *MapType, h *Hmap, key *byte) (val *byte) {
-       if(raceenabled && h != nil) {
-               runtime·racereadpc(h, runtime·getcallerpc(&t), reflect·mapaccess);
-               runtime·racereadobjectpc(key, t->key, runtime·getcallerpc(&t), reflect·mapaccess);
+       if(h == nil)
+               val = nil;
+       else {
+               if(raceenabled) {
+                       runtime·racereadpc(h, runtime·getcallerpc(&t), reflect·mapaccess);
+                       runtime·racereadobjectpc(key, t->key, runtime·getcallerpc(&t), reflect·mapaccess);
+               }
+               val = hash_lookup(t, h, &key);
        }
-       val = hash_lookup(t, h, &key);
 }
 
 #pragma textflag NOSPLIT