From: Matthew Dempsky Date: Thu, 28 Sep 2017 03:14:54 +0000 (-0700) Subject: reflect: fix method indexing for non-ASCII exported methods X-Git-Tag: go1.10beta1~944 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=6f1724ff415a85b3329806c0c9a3e5e46afac317;p=gostls13.git 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 TryBot-Result: Gobot Gobot Reviewed-by: David Crawshaw --- diff --git a/src/reflect/all_test.go b/src/reflect/all_test.go index b101818519..efa9fe13d2 100644 --- a/src/reflect/all_test.go +++ b/src/reflect/all_test.go @@ -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) +} diff --git a/src/reflect/value.go b/src/reflect/value.go index 91b0e37f50..e9bfe550f4 100644 --- a/src/reflect/value.go +++ b/src/reflect/value.go @@ -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) }