1
0
mirror of https://github.com/golang/go synced 2024-11-19 15:05:00 -07:00

reflect: handle types with unexported methods before exported ones

The method Method expects index to be an index of exported fields,
but, before this change, the index used by MethodByName could
take into account unexported fields if those happened sort
before the exported one.

Fixes #21177

Change-Id: I90bb64a47b23e2e43fdd2b8a1e0a2c9a8a63ded2
Reviewed-on: https://go-review.googlesource.com/51810
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
André Carvalho 2017-07-28 20:31:20 -03:00 committed by Ian Lance Taylor
parent e0ab505a97
commit 77b4beba2f
2 changed files with 25 additions and 2 deletions

View File

@ -5521,6 +5521,25 @@ func TestKeepFuncLive(t *testing.T) {
MakeFunc(typ, f).Call([]Value{ValueOf(10)})
}
type UnExportedFirst int
func (i UnExportedFirst) ΦExported() {}
func (i UnExportedFirst) unexported() {}
// Issue 21177
func TestMethodByNameUnExportedFirst(t *testing.T) {
defer func() {
if recover() != nil {
t.Errorf("should not panic")
}
}()
typ := TypeOf(UnExportedFirst(0))
m, _ := typ.MethodByName("ΦExported")
if m.Name != "ΦExported" {
t.Errorf("got %s, expected ΦExported", m.Name)
}
}
// Issue 18635 (method version).
type KeepMethodLive struct{}

View File

@ -871,11 +871,15 @@ func (t *rtype) MethodByName(name string) (m Method, ok bool) {
return Method{}, false
}
utmethods := ut.methods()
var eidx int
for i := 0; i < int(ut.mcount); i++ {
p := utmethods[i]
pname := t.nameOff(p.name)
if pname.isExported() && pname.name() == name {
return t.Method(i), true
if pname.isExported() {
if pname.name() == name {
return t.Method(eidx), true
}
eidx++
}
}
return Method{}, false