1
0
mirror of https://github.com/golang/go synced 2024-11-26 20:11:26 -07:00

reflect: test, fix access to nil maps

Fixes #8010.

LGTM=bradfitz, khr
R=khr, bradfitz, dvyukov
CC=golang-codereviews
https://golang.org/cl/91450048
This commit is contained in:
Russ Cox 2014-05-19 09:36:47 -04:00
parent e893acf184
commit d54b67df0c
2 changed files with 30 additions and 4 deletions

View 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

View 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