"bufio"
"bytes"
"cmd/compile/internal/types"
- "cmd/internal/obj"
"cmd/internal/src"
"encoding/binary"
"fmt"
"io"
"math/big"
+ "sort"
"strings"
)
for pkg, objs := range pkgObjs {
pkgs = append(pkgs, pkg)
- obj.SortSlice(objs, func(i, j int) bool {
+ sort.Slice(objs, func(i, j int) bool {
return objs[i].Sym.Name < objs[j].Sym.Name
})
}
- obj.SortSlice(pkgs, func(i, j int) bool {
+ sort.Slice(pkgs, func(i, j int) bool {
return pkgs[i].Path < pkgs[j].Path
})
"path"
"regexp"
"runtime"
+ "sort"
"strconv"
"strings"
)
}
// Check whether any of the functions we have compiled have gigantic stack frames.
- obj.SortSlice(largeStackFrames, func(i, j int) bool {
+ sort.Slice(largeStackFrames, func(i, j int) bool {
return largeStackFrames[i].pos.Before(largeStackFrames[j].pos)
})
for _, large := range largeStackFrames {
}
}
- obj.SortSlice(unused, func(i, j int) bool { return unused[i].pos.Before(unused[j].pos) })
+ sort.Slice(unused, func(i, j int) bool { return unused[i].pos.Before(unused[j].pos) })
for _, pkg := range unused {
pkgnotused(pkg.pos, pkg.path, pkg.name)
}
"encoding/json"
"fmt"
"io"
+ "sort"
"strconv"
)
}
}
- obj.SortSlice(funcsyms, func(i, j int) bool {
+ sort.Slice(funcsyms, func(i, j int) bool {
return funcsyms[i].LinksymName() < funcsyms[j].LinksymName()
})
for _, s := range funcsyms {
// Compile the longest functions first,
// since they're most likely to be the slowest.
// This helps avoid stragglers.
- obj.SortSlice(compilequeue, func(i, j int) bool {
+ sort.Slice(compilequeue, func(i, j int) bool {
return compilequeue[i].Nbody.Len() > compilequeue[j].Nbody.Len()
})
}
import (
"cmd/compile/internal/types"
- "cmd/internal/obj"
"reflect"
+ "sort"
"testing"
)
if reflect.DeepEqual(data, want) {
t.Fatal("data must be shuffled")
}
- obj.SortSlice(data, func(i, j int) bool { return data[i].Less(data[j]) })
+ sort.Slice(data, func(i, j int) bool { return data[i].Less(data[j]) })
if !reflect.DeepEqual(data, want) {
t.Logf("want: %#v", want)
t.Logf("data: %#v", data)
+++ /dev/null
-// 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)
-}
// As they are created during Progedit, two symbols can be switched between
// two different compilations. Therefore, BuildID will be different.
// TODO: find a better place and optimize to only sort TOC symbols
- SortSlice(ctxt.Data, func(i, j int) bool {
+ sort.Slice(ctxt.Data, func(i, j int) bool {
return ctxt.Data[i].Name < ctxt.Data[j].Name
})
}
var haveImport = map[string]bool{}
for _, file := range files {
name := file.Name()
- if name == "slice_pre113.go" {
- // This file is ignored by build tags which aren't
- // handled by this findImports func.
+ if name == "slice_go14.go" || name == "slice_go18.go" {
+ // These files are for compiler bootstrap with older versions of Go and not built in the standard build.
continue
}
if !strings.HasSuffix(name, ".go") || strings.HasSuffix(name, "_test.go") {
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// +build !compiler_bootstrap go1.13
-
package sort
-import (
- "internal/reflectlite"
-)
-
// Slice sorts the provided slice given the provided less function.
//
// The sort is not guaranteed to be stable. For a stable sort, use
//
// The function panics if the provided interface is not a slice.
func Slice(slice interface{}, less func(i, j int) bool) {
- rv := reflectlite.ValueOf(slice)
- swap := reflectlite.Swapper(slice)
+ rv := reflectValueOf(slice)
+ swap := reflectSwapper(slice)
length := rv.Len()
quickSort_func(lessSwap{less, swap}, 0, length, maxDepth(length))
}
//
// The function panics if the provided interface is not a slice.
func SliceStable(slice interface{}, less func(i, j int) bool) {
- rv := reflectlite.ValueOf(slice)
- swap := reflectlite.Swapper(slice)
+ rv := reflectValueOf(slice)
+ swap := reflectSwapper(slice)
stable_func(lessSwap{less, swap}, rv.Len())
}
//
// The function panics if the provided interface is not a slice.
func SliceIsSorted(slice interface{}, less func(i, j int) bool) bool {
- rv := reflectlite.ValueOf(slice)
+ rv := reflectValueOf(slice)
n := rv.Len()
for i := n - 1; i > 0; i-- {
if less(i, i-1) {
--- /dev/null
+// 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.13
+
+package sort
+
+import "internal/reflectlite"
+
+var reflectValueOf = reflectlite.ValueOf
+var reflectSwapper = reflectlite.Swapper
--- /dev/null
+// 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 sort
+
+import "reflect"
+
+var reflectValueOf = reflect.ValueOf
+
+func reflectSwapper(x interface{}) func(int, int) {
+ v := reflectValueOf(x)
+ tmp := reflect.New(v.Type().Elem()).Elem()
+ return func(i, j int) {
+ a, b := v.Index(i), v.Index(j)
+ tmp.Set(a)
+ a.Set(b)
+ b.Set(tmp)
+ }
+}
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// +build go1.8
+// +build go1.8,!go1.13
-package obj
+package sort
-import "sort"
+import "reflect"
-func SortSlice(slice interface{}, less func(i, j int) bool) {
- sort.Slice(slice, less)
-}
+var reflectValueOf = reflect.ValueOf
+var reflectSwapper = reflect.Swapper
+++ /dev/null
-// 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,!go1.13
-
-package sort
-
-import "reflect"
-
-// Slice sorts the provided slice given the provided less function.
-//
-// The sort is not guaranteed to be stable. For a stable sort, use
-// SliceStable.
-//
-// The function panics if the provided interface is not a slice.
-func Slice(slice interface{}, less func(i, j int) bool) {
- rv := reflect.ValueOf(slice)
- swap := reflect.Swapper(slice)
- length := rv.Len()
- quickSort_func(lessSwap{less, swap}, 0, length, maxDepth(length))
-}
-
-// SliceStable sorts the provided slice given the provided less
-// function while keeping the original order of equal elements.
-//
-// The function panics if the provided interface is not a slice.
-func SliceStable(slice interface{}, less func(i, j int) bool) {
- rv := reflect.ValueOf(slice)
- swap := reflect.Swapper(slice)
- stable_func(lessSwap{less, swap}, rv.Len())
-}
-
-// SliceIsSorted tests whether a slice is sorted.
-//
-// The function panics if the provided interface is not a slice.
-func SliceIsSorted(slice interface{}, less func(i, j int) bool) bool {
- rv := reflect.ValueOf(slice)
- n := rv.Len()
- for i := n - 1; i > 0; i-- {
- if less(i, i-1) {
- return false
- }
- }
- return true
-}