]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.r57] reflect: allow unexported key in Value.MapIndex
authorRuss Cox <rsc@golang.org>
Tue, 3 May 2011 15:08:57 +0000 (11:08 -0400)
committerRuss Cox <rsc@golang.org>
Tue, 3 May 2011 15:08:57 +0000 (11:08 -0400)
««« CL 4444087 / 9abf81a9df90
reflect: allow unexported key in Value.MapIndex

Fixes #1748.

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

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

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

index 5bf65333c915dd3a6a6163ff63cd2a5c23b97632..dee3f4915bbb3abd154fe6b0a3ba130d93b9ed02 100644 (file)
@@ -182,7 +182,9 @@ var valueTests = []pair{
        }),
                "struct { c chan *int32; d float32 }{chan *int32, 0}",
        },
-       {new(struct{ c func(chan *integer, *int8) }),
+       {new(struct {
+               c func(chan *integer, *int8)
+       }),
                "struct { c func(chan *reflect_test.integer, *int8) }{func(chan *reflect_test.integer, *int8)(0)}",
        },
        {new(struct {
@@ -732,6 +734,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 {