diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/cmd/compile/internal/gc/reflect.go | 13 | ||||
-rw-r--r-- | src/cmd/compile/internal/gc/reflect_test.go | 7 | ||||
-rw-r--r-- | src/cmd/internal/obj/bootstrap.go | 34 | ||||
-rw-r--r-- | src/cmd/internal/obj/sort.go | 13 |
4 files changed, 52 insertions, 15 deletions
diff --git a/src/cmd/compile/internal/gc/reflect.go b/src/cmd/compile/internal/gc/reflect.go index 66af2bf01c..9597aa893d 100644 --- a/src/cmd/compile/internal/gc/reflect.go +++ b/src/cmd/compile/internal/gc/reflect.go @@ -49,16 +49,7 @@ type Sig struct { offset int32 } -// byMethodNameAndPackagePath sorts method signatures by name, then package path. -type byMethodNameAndPackagePath []*Sig - -func (x byMethodNameAndPackagePath) Len() int { return len(x) } -func (x byMethodNameAndPackagePath) Swap(i, j int) { x[i], x[j] = x[j], x[i] } -func (x byMethodNameAndPackagePath) Less(i, j int) bool { - return siglt(x[i], x[j]) -} - -// siglt reports whether a < b +// siglt sorts method signatures by name, then package path. func siglt(a, b *Sig) bool { if a.name != b.name { return a.name < b.name @@ -382,7 +373,7 @@ func methods(t *types.Type) []*Sig { } } - sort.Sort(byMethodNameAndPackagePath(ms)) + obj.SortSlice(ms, func(i, j int) bool { return siglt(ms[i], ms[j]) }) return ms } diff --git a/src/cmd/compile/internal/gc/reflect_test.go b/src/cmd/compile/internal/gc/reflect_test.go index ad3cad73c0..fe6dcf0d2e 100644 --- a/src/cmd/compile/internal/gc/reflect_test.go +++ b/src/cmd/compile/internal/gc/reflect_test.go @@ -6,12 +6,12 @@ package gc import ( "cmd/compile/internal/types" + "cmd/internal/obj" "reflect" - "sort" "testing" ) -func TestSortingByMethodNameAndPackagePath(t *testing.T) { +func TestSortingBySigLT(t *testing.T) { data := []*Sig{ &Sig{name: "b", pkg: &types.Pkg{Path: "abc"}}, &Sig{name: "b", pkg: nil}, @@ -38,11 +38,10 @@ func TestSortingByMethodNameAndPackagePath(t *testing.T) { if reflect.DeepEqual(data, want) { t.Fatal("data must be shuffled") } - sort.Sort(byMethodNameAndPackagePath(data)) + obj.SortSlice(data, func(i, j int) bool { return siglt(data[i], data[j]) }) if !reflect.DeepEqual(data, want) { t.Logf("want: %#v", want) t.Logf("data: %#v", data) t.Errorf("sorting failed") } - } diff --git a/src/cmd/internal/obj/bootstrap.go b/src/cmd/internal/obj/bootstrap.go new file mode 100644 index 0000000000..42835e1d9d --- /dev/null +++ b/src/cmd/internal/obj/bootstrap.go @@ -0,0 +1,34 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !go1.8 + +package obj + +import ( + "reflect" + "sort" +) + +func SortSlice(slice interface{}, less func(i, j int) bool) { + val := reflect.ValueOf(slice) + tmp := reflect.New(val.Type().Elem()).Elem() + x := sliceByFn{val: val, tmp: tmp, less: less} + sort.Sort(x) +} + +type sliceByFn struct { + val reflect.Value + tmp reflect.Value + less func(i, j int) bool +} + +func (x sliceByFn) Len() int { return x.val.Len() } +func (x sliceByFn) Less(i, j int) bool { return x.less(i, j) } +func (x sliceByFn) Swap(i, j int) { + a, b := x.val.Index(i), x.val.Index(j) + x.tmp.Set(a) + a.Set(b) + b.Set(x.tmp) +} diff --git a/src/cmd/internal/obj/sort.go b/src/cmd/internal/obj/sort.go new file mode 100644 index 0000000000..0cb801ee98 --- /dev/null +++ b/src/cmd/internal/obj/sort.go @@ -0,0 +1,13 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build go1.8 + +package obj + +import "sort" + +func SortSlice(slice interface{}, less func(i, j int) bool) { + sort.Slice(slice, less) +} |