Skip to content

Commit

Permalink
reflect: fix method indexing for non-ASCII exported methods
Browse files Browse the repository at this point in the history
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 <[email protected]>
TryBot-Result: Gobot Gobot <[email protected]>
Reviewed-by: David Crawshaw <[email protected]>
  • Loading branch information
mdempsky committed Sep 28, 2017
1 parent b3cae37 commit 6f1724f
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 6 deletions.
16 changes: 16 additions & 0 deletions src/reflect/all_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
12 changes: 6 additions & 6 deletions src/reflect/value.go
Original file line number Diff line number Diff line change
Expand Up @@ -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")
}
Expand Down Expand Up @@ -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)
}

Expand Down

0 comments on commit 6f1724f

Please sign in to comment.