Commit 6f1724ff authored by Matthew Dempsky's avatar Matthew Dempsky

reflect: fix method indexing for non-ASCII exported methods

Currently, methods are sorted by name. This happens to guarantee that
exported ASCII methods appear before non-exported ASCII methods, but
this breaks down when Unicode method names are considered.

Type.Method already accounts for this by always indexing into the
slice returned by exportedMethods. This CL makes Value.Method do the
same.

Fixes #22073.

Change-Id: I9bfc6bbfb7353e0bd3c439a15d1c3da60d16d209
Reviewed-on: https://go-review.googlesource.com/66770
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: 's avatarDavid Crawshaw <crawshaw@golang.org>
parent b3cae374
......@@ -6405,3 +6405,19 @@ func TestIssue22031(t *testing.T) {
}
}
}
type NonExportedFirst int
func (i NonExportedFirst) ΦExported() {}
func (i NonExportedFirst) nonexported() int { panic("wrong") }
func TestIssue22073(t *testing.T) {
m := ValueOf(NonExportedFirst(0)).Method(0)
if got := m.Type().NumOut(); got != 0 {
t.Errorf("NumOut: got %v, want 0", got)
}
// Shouldn't panic.
m.Call(nil)
}
......@@ -584,11 +584,11 @@ func methodReceiver(op string, v Value, methodIndex int) (rcvrtype, t *rtype, fn
t = tt.typeOff(m.typ)
} else {
rcvrtype = v.typ
ut := v.typ.uncommon()
if ut == nil || uint(i) >= uint(ut.mcount) {
ms := v.typ.exportedMethods()
if uint(i) >= uint(len(ms)) {
panic("reflect: internal error: invalid method index")
}
m := ut.methods()[i]
m := ms[i]
if !v.typ.nameOff(m.name).isExported() {
panic("reflect: " + op + " of unexported method")
}
......@@ -1717,11 +1717,11 @@ func (v Value) Type() Type {
return v.typ.typeOff(m.typ)
}
// Method on concrete type.
ut := v.typ.uncommon()
if ut == nil || uint(i) >= uint(ut.mcount) {
ms := v.typ.exportedMethods()
if uint(i) >= uint(len(ms)) {
panic("reflect: internal error: invalid method index")
}
m := ut.methods()[i]
m := ms[i]
return v.typ.typeOff(m.mtyp)
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment