]> Cypherpunks repositories - gostls13.git/commitdiff
reflect: allow unexported key in Value.MapIndex
authorRuss Cox <rsc@golang.org>
Tue, 3 May 2011 14:38:37 +0000 (10:38 -0400)
committerRuss Cox <rsc@golang.org>
Tue, 3 May 2011 14:38:37 +0000 (10:38 -0400)
Fixes #1748.

R=golang-dev, r
CC=golang-dev
https://golang.org/cl/4444087

src/pkg/reflect/all_test.go
src/pkg/reflect/value.go

index 00d59d808159bba9dffc978c283f8dab747e908f..991d5ca8b7fd7c29402f06487f4122e6cdfca223 100644 (file)
@@ -726,6 +726,24 @@ func TestDeepEqualComplexStructInequality(t *testing.T) {
        }
 }
 
+type UnexpT struct {
+       m map[int]int
+}
+
+func TestDeepEqualUnexportedMap(t *testing.T) {
+       // Check that DeepEqual can look at unexported fields.
+       x1 := UnexpT{map[int]int{1: 2}}
+       x2 := UnexpT{map[int]int{1: 2}}
+       if !DeepEqual(&x1, &x2) {
+               t.Error("DeepEqual(x1, x2) = false, want true")
+       }
+
+       y1 := UnexpT{map[int]int{2: 3}}
+       if DeepEqual(&x1, &y1) {
+               t.Error("DeepEqual(x1, y1) = true, want false")
+       }
+}
+
 
 func check2ndField(x interface{}, offs uintptr, t *testing.T) {
        s := ValueOf(x)
index 6dffb07833f304847aa312533c593b36d9efd49d..2c2158a3cd5d5004f3e12569bdc514c3818ecc70 100644 (file)
@@ -958,14 +958,19 @@ func (v Value) MapIndex(key Value) Value {
        iv.mustBe(Map)
        typ := iv.typ.toType()
 
+       // Do not require ikey to be exported, so that DeepEqual
+       // and other programs can use all the keys returned by
+       // MapKeys as arguments to MapIndex.  If either the map
+       // or the key is unexported, though, the result will be
+       // considered unexported.
+
        ikey := key.internal()
-       ikey.mustBeExported()
        ikey = convertForAssignment("reflect.Value.MapIndex", nil, typ.Key(), ikey)
        if iv.word == 0 {
                return Value{}
        }
 
-       flag := iv.flag & flagRO
+       flag := (iv.flag | ikey.flag) & flagRO
        elemType := typ.Elem()
        elemWord, ok := mapaccess(iv.word, ikey.word)
        if !ok {