summaryrefslogtreecommitdiff
path: root/src/cmd/internal/obj/bootstrap.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/internal/obj/bootstrap.go')
-rw-r--r--src/cmd/internal/obj/bootstrap.go34
1 files changed, 34 insertions, 0 deletions
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)
+}