summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cmd/compile/internal/gc/reflect.go13
-rw-r--r--src/cmd/compile/internal/gc/reflect_test.go7
-rw-r--r--src/cmd/internal/obj/bootstrap.go34
-rw-r--r--src/cmd/internal/obj/sort.go13
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)
+}