Revert "all: update golang/x/ext and fix slice sorting fallout (#27909)"

This reverts commit 1c411fcea2.
This commit is contained in:
devopsbo3 2023-11-10 12:27:53 -06:00 committed by GitHub
parent 5337c9fa1f
commit b3a35f84e7
38 changed files with 113 additions and 144 deletions

View file

@ -40,8 +40,8 @@ import (
const minReloadInterval = 2 * time.Second const minReloadInterval = 2 * time.Second
// byURL defines the sorting order for accounts. // byURL defines the sorting order for accounts.
func byURL(a, b accounts.Account) int { func byURL(a, b accounts.Account) bool {
return a.URL.Cmp(b.URL) return a.URL.Cmp(b.URL) < 0
} }
// AmbiguousAddrError is returned when attempting to unlock // AmbiguousAddrError is returned when attempting to unlock

View file

@ -288,17 +288,11 @@ func makeDeletionChanges(records map[string]recordSet, keep map[string]string) [
// sortChanges ensures DNS changes are in leaf-added -> root-changed -> leaf-deleted order. // sortChanges ensures DNS changes are in leaf-added -> root-changed -> leaf-deleted order.
func sortChanges(changes []types.Change) { func sortChanges(changes []types.Change) {
score := map[string]int{"CREATE": 1, "UPSERT": 2, "DELETE": 3} score := map[string]int{"CREATE": 1, "UPSERT": 2, "DELETE": 3}
slices.SortFunc(changes, func(a, b types.Change) int { slices.SortFunc(changes, func(a, b types.Change) bool {
if a.Action == b.Action { if a.Action == b.Action {
return strings.Compare(*a.ResourceRecordSet.Name, *b.ResourceRecordSet.Name) return *a.ResourceRecordSet.Name < *b.ResourceRecordSet.Name
} }
if score[string(a.Action)] < score[string(b.Action)] { return score[string(a.Action)] < score[string(b.Action)]
return -1
}
if score[string(a.Action)] > score[string(b.Action)] {
return 1
}
return 0
}) })
} }

View file

@ -77,8 +77,8 @@ func (ns nodeSet) nodes() []*enode.Node {
result = append(result, n.N) result = append(result, n.N)
} }
// Sort by ID. // Sort by ID.
slices.SortFunc(result, func(a, b *enode.Node) int { slices.SortFunc(result, func(a, b *enode.Node) bool {
return bytes.Compare(a.ID().Bytes(), b.ID().Bytes()) return bytes.Compare(a.ID().Bytes(), b.ID().Bytes()) < 0
}) })
return result return result
} }
@ -103,14 +103,8 @@ func (ns nodeSet) topN(n int) nodeSet {
for _, v := range ns { for _, v := range ns {
byscore = append(byscore, v) byscore = append(byscore, v)
} }
slices.SortFunc(byscore, func(a, b nodeJSON) int { slices.SortFunc(byscore, func(a, b nodeJSON) bool {
if a.Score > b.Score { return a.Score >= b.Score
return -1
}
if a.Score < b.Score {
return 1
}
return 0
}) })
result := make(nodeSet, n) result := make(nodeSet, n)
for _, v := range byscore[:n] { for _, v := range byscore[:n] {

View file

@ -65,9 +65,9 @@ func BigToHash(b *big.Int) Hash { return BytesToHash(b.Bytes()) }
// If b is larger than len(h), b will be cropped from the left. // If b is larger than len(h), b will be cropped from the left.
func HexToHash(s string) Hash { return BytesToHash(FromHex(s)) } func HexToHash(s string) Hash { return BytesToHash(FromHex(s)) }
// Cmp compares two hashes. // Less compares two hashes.
func (h Hash) Cmp(other Hash) int { func (h Hash) Less(other Hash) bool {
return bytes.Compare(h[:], other[:]) return bytes.Compare(h[:], other[:]) < 0
} }
// Bytes gets the byte representation of the underlying hash. // Bytes gets the byte representation of the underlying hash.
@ -231,9 +231,9 @@ func IsHexAddress(s string) bool {
return len(s) == 2*AddressLength && isHex(s) return len(s) == 2*AddressLength && isHex(s)
} }
// Cmp compares two addresses. // Less compares two addresses.
func (a Address) Cmp(other Address) int { func (a Address) Less(other Address) bool {
return bytes.Compare(a[:], other[:]) return bytes.Compare(a[:], other[:]) < 0
} }
// Bytes gets the string representation of the underlying address. // Bytes gets the string representation of the underlying address.

View file

@ -308,7 +308,7 @@ func (s *Snapshot) signers() []common.Address {
for sig := range s.Signers { for sig := range s.Signers {
sigs = append(sigs, sig) sigs = append(sigs, sig)
} }
slices.SortFunc(sigs, common.Address.Cmp) slices.SortFunc(sigs, common.Address.Less)
return sigs return sigs
} }

View file

@ -53,7 +53,7 @@ func (ap *testerAccountPool) checkpoint(header *types.Header, signers []string)
for i, signer := range signers { for i, signer := range signers {
auths[i] = ap.address(signer) auths[i] = ap.address(signer)
} }
slices.SortFunc(auths, common.Address.Cmp) slices.SortFunc(auths, common.Address.Less)
for i, auth := range auths { for i, auth := range auths {
copy(header.Extra[extraVanity+i*common.AddressLength:], auth.Bytes()) copy(header.Extra[extraVanity+i*common.AddressLength:], auth.Bytes())
} }

View file

@ -1053,8 +1053,8 @@ func (bc *BlockChain) procFutureBlocks() {
} }
} }
if len(blocks) > 0 { if len(blocks) > 0 {
slices.SortFunc(blocks, func(a, b *types.Block) int { slices.SortFunc(blocks, func(a, b *types.Block) bool {
return a.Number().Cmp(b.Number()) return a.NumberU64() < b.NumberU64()
}) })
// Insert one by one as chain insertion needs contiguous ancestry between blocks // Insert one by one as chain insertion needs contiguous ancestry between blocks
for i := range blocks { for i := range blocks {

View file

@ -902,9 +902,9 @@ func WriteBadBlock(db ethdb.KeyValueStore, block *types.Block) {
Header: block.Header(), Header: block.Header(),
Body: block.Body(), Body: block.Body(),
}) })
slices.SortFunc(badBlocks, func(a, b *badBlock) int { slices.SortFunc(badBlocks, func(a, b *badBlock) bool {
// Note: sorting in descending number order. // Note: sorting in descending number order.
return -a.Header.Number.Cmp(b.Header.Number) return a.Header.Number.Uint64() >= b.Header.Number.Uint64()
}) })
if len(badBlocks) > badBlockToKeep { if len(badBlocks) > badBlockToKeep {
badBlocks = badBlocks[:badBlockToKeep] badBlocks = badBlocks[:badBlockToKeep]

View file

@ -19,12 +19,12 @@ package rawdb
import ( import (
"math/big" "math/big"
"reflect" "reflect"
"sort"
"sync" "sync"
"testing" "testing"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/types"
"golang.org/x/exp/slices"
) )
func TestChainIterator(t *testing.T) { func TestChainIterator(t *testing.T) {
@ -92,9 +92,11 @@ func TestChainIterator(t *testing.T) {
} }
} }
if !c.reverse { if !c.reverse {
sort.Ints(numbers) slices.Sort(numbers)
} else { } else {
sort.Sort(sort.Reverse(sort.IntSlice(numbers))) slices.SortFunc(numbers, func(a, b int) bool {
return a > b // Sort descending
})
} }
if !reflect.DeepEqual(numbers, c.expect) { if !reflect.DeepEqual(numbers, c.expect) {
t.Fatalf("Case %d failed, visit element mismatch, want %v, got %v", i, c.expect, numbers) t.Fatalf("Case %d failed, visit element mismatch, want %v, got %v", i, c.expect, numbers)

View file

@ -525,7 +525,7 @@ func (dl *diffLayer) AccountList() []common.Hash {
dl.accountList = append(dl.accountList, hash) dl.accountList = append(dl.accountList, hash)
} }
} }
slices.SortFunc(dl.accountList, common.Hash.Cmp) slices.SortFunc(dl.accountList, common.Hash.Less)
dl.memory += uint64(len(dl.accountList) * common.HashLength) dl.memory += uint64(len(dl.accountList) * common.HashLength)
return dl.accountList return dl.accountList
} }
@ -563,7 +563,7 @@ func (dl *diffLayer) StorageList(accountHash common.Hash) ([]common.Hash, bool)
for k := range storageMap { for k := range storageMap {
storageList = append(storageList, k) storageList = append(storageList, k)
} }
slices.SortFunc(storageList, common.Hash.Cmp) slices.SortFunc(storageList, common.Hash.Less)
dl.storageList[accountHash] = storageList dl.storageList[accountHash] = storageList
dl.memory += uint64(len(dl.storageList)*common.HashLength + common.HashLength) dl.memory += uint64(len(dl.storageList)*common.HashLength + common.HashLength)
return storageList, destructed return storageList, destructed

View file

@ -33,25 +33,19 @@ type weightedIterator struct {
priority int priority int
} }
func (it *weightedIterator) Cmp(other *weightedIterator) int { func (it *weightedIterator) Less(other *weightedIterator) bool {
// Order the iterators primarily by the account hashes // Order the iterators primarily by the account hashes
hashI := it.it.Hash() hashI := it.it.Hash()
hashJ := other.it.Hash() hashJ := other.it.Hash()
switch bytes.Compare(hashI[:], hashJ[:]) { switch bytes.Compare(hashI[:], hashJ[:]) {
case -1: case -1:
return -1 return true
case 1: case 1:
return 1 return false
} }
// Same account/storage-slot in multiple layers, split by priority // Same account/storage-slot in multiple layers, split by priority
if it.priority < other.priority { return it.priority < other.priority
return -1
}
if it.priority > other.priority {
return 1
}
return 0
} }
// fastIterator is a more optimized multi-layer iterator which maintains a // fastIterator is a more optimized multi-layer iterator which maintains a
@ -161,7 +155,9 @@ func (fi *fastIterator) init() {
} }
} }
// Re-sort the entire list // Re-sort the entire list
slices.SortFunc(fi.iterators, func(a, b *weightedIterator) int { return a.Cmp(b) }) slices.SortFunc(fi.iterators, func(a, b *weightedIterator) bool {
return a.Less(b)
})
fi.initiated = false fi.initiated = false
} }

View file

@ -105,7 +105,7 @@ func TestAccountRange(t *testing.T) {
} }
// Test to see if it's possible to recover from the middle of the previous // Test to see if it's possible to recover from the middle of the previous
// set and get an even split between the first and second sets. // set and get an even split between the first and second sets.
slices.SortFunc(hList, common.Hash.Cmp) slices.SortFunc(hList, common.Hash.Less)
middleH := hList[AccountRangeMaxResults/2] middleH := hList[AccountRangeMaxResults/2]
middleResult := accountRangeTest(t, &trie, sdb, middleH, AccountRangeMaxResults, AccountRangeMaxResults) middleResult := accountRangeTest(t, &trie, sdb, middleH, AccountRangeMaxResults, AccountRangeMaxResults)
missing, infirst, insecond := 0, 0, 0 missing, infirst, insecond := 0, 0, 0

View file

@ -111,8 +111,8 @@ func (oracle *Oracle) processBlock(bf *blockFees, percentiles []float64) {
reward, _ := tx.EffectiveGasTip(bf.block.BaseFee()) reward, _ := tx.EffectiveGasTip(bf.block.BaseFee())
sorter[i] = txGasAndReward{gasUsed: bf.receipts[i].GasUsed, reward: reward} sorter[i] = txGasAndReward{gasUsed: bf.receipts[i].GasUsed, reward: reward}
} }
slices.SortStableFunc(sorter, func(a, b txGasAndReward) int { slices.SortStableFunc(sorter, func(a, b txGasAndReward) bool {
return a.reward.Cmp(b.reward) return a.reward.Cmp(b.reward) < 0
}) })
var txIndex int var txIndex int

View file

@ -208,7 +208,7 @@ func (oracle *Oracle) SuggestTipCap(ctx context.Context) (*big.Int, error) {
} }
price := lastPrice price := lastPrice
if len(results) > 0 { if len(results) > 0 {
slices.SortFunc(results, func(a, b *big.Int) int { return a.Cmp(b) }) slices.SortFunc(results, func(a, b *big.Int) bool { return a.Cmp(b) < 0 })
price = results[(len(results)-1)*oracle.percentile/100] price = results[(len(results)-1)*oracle.percentile/100]
} }
if price.Cmp(oracle.maxPrice) > 0 { if price.Cmp(oracle.maxPrice) > 0 {
@ -247,12 +247,12 @@ func (oracle *Oracle) getBlockValues(ctx context.Context, blockNum uint64, limit
sortedTxs := make([]*types.Transaction, len(txs)) sortedTxs := make([]*types.Transaction, len(txs))
copy(sortedTxs, txs) copy(sortedTxs, txs)
baseFee := block.BaseFee() baseFee := block.BaseFee()
slices.SortFunc(sortedTxs, func(a, b *types.Transaction) int { slices.SortFunc(sortedTxs, func(a, b *types.Transaction) bool {
// It's okay to discard the error because a tx would never be // It's okay to discard the error because a tx would never be
// accepted into a block with an invalid effective tip. // accepted into a block with an invalid effective tip.
tip1, _ := a.EffectiveGasTip(baseFee) tip1, _ := a.EffectiveGasTip(baseFee)
tip2, _ := b.EffectiveGasTip(baseFee) tip2, _ := b.EffectiveGasTip(baseFee)
return tip1.Cmp(tip2) return tip1.Cmp(tip2) < 0
}) })
var prices []*big.Int var prices []*big.Int

View file

@ -1417,8 +1417,8 @@ type kv struct {
k, v []byte k, v []byte
} }
func (k *kv) cmp(other *kv) int { func (k *kv) less(other *kv) bool {
return bytes.Compare(k.k, other.k) return bytes.Compare(k.k, other.k) < 0
} }
func key32(i uint64) []byte { func key32(i uint64) []byte {
@ -1478,7 +1478,7 @@ func makeAccountTrieNoStorage(n int, scheme string) (string, *trie.Trie, []*kv)
accTrie.MustUpdate(elem.k, elem.v) accTrie.MustUpdate(elem.k, elem.v)
entries = append(entries, elem) entries = append(entries, elem)
} }
slices.SortFunc(entries, (*kv).cmp) slices.SortFunc(entries, (*kv).less)
// Commit the state changes into db and re-create the trie // Commit the state changes into db and re-create the trie
// for accessing later. // for accessing later.
@ -1540,7 +1540,7 @@ func makeBoundaryAccountTrie(scheme string, n int) (string, *trie.Trie, []*kv) {
accTrie.MustUpdate(elem.k, elem.v) accTrie.MustUpdate(elem.k, elem.v)
entries = append(entries, elem) entries = append(entries, elem)
} }
slices.SortFunc(entries, (*kv).cmp) slices.SortFunc(entries, (*kv).less)
// Commit the state changes into db and re-create the trie // Commit the state changes into db and re-create the trie
// for accessing later. // for accessing later.
@ -1587,7 +1587,7 @@ func makeAccountTrieWithStorageWithUniqueStorage(scheme string, accounts, slots
storageRoots[common.BytesToHash(key)] = stRoot storageRoots[common.BytesToHash(key)] = stRoot
storageEntries[common.BytesToHash(key)] = stEntries storageEntries[common.BytesToHash(key)] = stEntries
} }
slices.SortFunc(entries, (*kv).cmp) slices.SortFunc(entries, (*kv).less)
// Commit account trie // Commit account trie
root, set, _ := accTrie.Commit(true) root, set, _ := accTrie.Commit(true)
@ -1652,7 +1652,7 @@ func makeAccountTrieWithStorage(scheme string, accounts, slots int, code, bounda
storageRoots[common.BytesToHash(key)] = stRoot storageRoots[common.BytesToHash(key)] = stRoot
storageEntries[common.BytesToHash(key)] = stEntries storageEntries[common.BytesToHash(key)] = stEntries
} }
slices.SortFunc(entries, (*kv).cmp) slices.SortFunc(entries, (*kv).less)
// Commit account trie // Commit account trie
root, set, _ := accTrie.Commit(true) root, set, _ := accTrie.Commit(true)
@ -1696,7 +1696,7 @@ func makeStorageTrieWithSeed(owner common.Hash, n, seed uint64, db *trie.Databas
trie.MustUpdate(elem.k, elem.v) trie.MustUpdate(elem.k, elem.v)
entries = append(entries, elem) entries = append(entries, elem)
} }
slices.SortFunc(entries, (*kv).cmp) slices.SortFunc(entries, (*kv).less)
root, nodes, _ := trie.Commit(false) root, nodes, _ := trie.Commit(false)
return root, nodes, entries return root, nodes, entries
} }
@ -1747,7 +1747,7 @@ func makeBoundaryStorageTrie(owner common.Hash, n int, db *trie.Database) (commo
trie.MustUpdate(elem.k, elem.v) trie.MustUpdate(elem.k, elem.v)
entries = append(entries, elem) entries = append(entries, elem)
} }
slices.SortFunc(entries, (*kv).cmp) slices.SortFunc(entries, (*kv).less)
root, nodes, _ := trie.Commit(false) root, nodes, _ := trie.Commit(false)
return root, nodes, entries return root, nodes, entries
} }

View file

@ -790,7 +790,7 @@ func newAccounts(n int) (accounts []Account) {
addr := crypto.PubkeyToAddress(key.PublicKey) addr := crypto.PubkeyToAddress(key.PublicKey)
accounts = append(accounts, Account{key: key, addr: addr}) accounts = append(accounts, Account{key: key, addr: addr})
} }
slices.SortFunc(accounts, func(a, b Account) int { return a.addr.Cmp(b.addr) }) slices.SortFunc(accounts, func(a, b Account) bool { return a.addr.Less(b.addr) })
return accounts return accounts
} }

View file

@ -527,7 +527,7 @@ func makeDataset(size, ksize, vsize int, order bool) ([][]byte, [][]byte) {
vals = append(vals, randBytes(vsize)) vals = append(vals, randBytes(vsize))
} }
if order { if order {
slices.SortFunc(keys, func(a, b []byte) int { return bytes.Compare(a, b) }) slices.SortFunc(keys, func(a, b []byte) bool { return bytes.Compare(a, b) < 0 })
} }
return keys, vals return keys, vals
} }

4
go.mod
View file

@ -63,7 +63,7 @@ require (
github.com/urfave/cli/v2 v2.24.1 github.com/urfave/cli/v2 v2.24.1
go.uber.org/automaxprocs v1.5.2 go.uber.org/automaxprocs v1.5.2
golang.org/x/crypto v0.9.0 golang.org/x/crypto v0.9.0
golang.org/x/exp v0.0.0-20230810033253-352e893a4cad golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc
golang.org/x/sync v0.3.0 golang.org/x/sync v0.3.0
golang.org/x/sys v0.9.0 golang.org/x/sys v0.9.0
golang.org/x/text v0.9.0 golang.org/x/text v0.9.0
@ -125,7 +125,7 @@ require (
github.com/tklauser/go-sysconf v0.3.5 // indirect github.com/tklauser/go-sysconf v0.3.5 // indirect
github.com/tklauser/numcpus v0.2.2 // indirect github.com/tklauser/numcpus v0.2.2 // indirect
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect
golang.org/x/mod v0.11.0 // indirect golang.org/x/mod v0.10.0 // indirect
golang.org/x/net v0.10.0 // indirect golang.org/x/net v0.10.0 // indirect
golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df // indirect golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df // indirect
google.golang.org/protobuf v1.28.1 // indirect google.golang.org/protobuf v1.28.1 // indirect

8
go.sum
View file

@ -479,8 +479,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g=
golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU= golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc h1:mCRnTeVUjcrhlRmO0VK8a6k6Rrf6TF9htwo2pJVSjIU=
golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
@ -490,8 +490,8 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk=
golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=

View file

@ -817,7 +817,7 @@ func newAccounts(n int) (accounts []Account) {
addr := crypto.PubkeyToAddress(key.PublicKey) addr := crypto.PubkeyToAddress(key.PublicKey)
accounts = append(accounts, Account{key: key, addr: addr}) accounts = append(accounts, Account{key: key, addr: addr})
} }
slices.SortFunc(accounts, func(a, b Account) int { return a.addr.Cmp(b.addr) }) slices.SortFunc(accounts, func(a, b Account) bool { return a.addr.Less(b.addr) })
return accounts return accounts
} }

View file

@ -215,14 +215,8 @@ func (sq *servingQueue) freezePeers() {
tasks.list = append(tasks.list, task) tasks.list = append(tasks.list, task)
tasks.sumTime += task.expTime tasks.sumTime += task.expTime
} }
slices.SortFunc(peerList, func(a, b *peerTasks) int { slices.SortFunc(peerList, func(a, b *peerTasks) bool {
if a.priority < b.priority { return a.priority < b.priority
return -1
}
if a.priority > b.priority {
return 1
}
return 0
}) })
drop := true drop := true
for _, tasks := range peerList { for _, tasks := range peerList {

View file

@ -369,14 +369,8 @@ func (l *Limiter) dropRequests() {
priority: w / float64(nq.sumCost), priority: w / float64(nq.sumCost),
}) })
} }
slices.SortFunc(list, func(a, b dropListItem) int { slices.SortFunc(list, func(a, b dropListItem) bool {
if a.priority < b.priority { return a.priority < b.priority
return -1
}
if a.priority < b.priority {
return 1
}
return 0
}) })
for _, item := range list { for _, item := range list {
for _, request := range item.nq.queue { for _, request := range item.nq.queue {

View file

@ -3,7 +3,6 @@ package metrics
import ( import (
"fmt" "fmt"
"io" "io"
"strings"
"time" "time"
"golang.org/x/exp/slices" "golang.org/x/exp/slices"
@ -24,7 +23,8 @@ func WriteOnce(r Registry, w io.Writer) {
r.Each(func(name string, i interface{}) { r.Each(func(name string, i interface{}) {
namedMetrics = append(namedMetrics, namedMetric{name, i}) namedMetrics = append(namedMetrics, namedMetric{name, i})
}) })
slices.SortFunc(namedMetrics, namedMetric.cmp)
slices.SortFunc(namedMetrics, namedMetric.less)
for _, namedMetric := range namedMetrics { for _, namedMetric := range namedMetrics {
switch metric := namedMetric.m.(type) { switch metric := namedMetric.m.(type) {
case Counter: case Counter:
@ -92,6 +92,6 @@ type namedMetric struct {
m interface{} m interface{}
} }
func (m namedMetric) cmp(other namedMetric) int { func (m namedMetric) less(other namedMetric) bool {
return strings.Compare(m.name, other.name) return m.name < other.name
} }

View file

@ -14,7 +14,7 @@ func TestMetricsSorting(t *testing.T) {
{name: "ggg"}, {name: "ggg"},
} }
slices.SortFunc(namedMetrics, namedMetric.cmp) slices.SortFunc(namedMetrics, namedMetric.less)
for i, name := range []string{"bbb", "fff", "ggg", "zzz"} { for i, name := range []string{"bbb", "fff", "ggg", "zzz"} {
if namedMetrics[i].name != name { if namedMetrics[i].name != name {
t.Fail() t.Fail()

View file

@ -217,14 +217,14 @@ func nodeEqual(n1 *enode.Node, n2 *enode.Node) bool {
} }
func sortByID(nodes []*enode.Node) { func sortByID(nodes []*enode.Node) {
slices.SortFunc(nodes, func(a, b *enode.Node) int { slices.SortFunc(nodes, func(a, b *enode.Node) bool {
return bytes.Compare(a.ID().Bytes(), b.ID().Bytes()) return string(a.ID().Bytes()) < string(b.ID().Bytes())
}) })
} }
func sortedByDistanceTo(distbase enode.ID, slice []*node) bool { func sortedByDistanceTo(distbase enode.ID, slice []*node) bool {
return slices.IsSortedFunc(slice, func(a, b *node) int { return slices.IsSortedFunc(slice, func(a, b *node) bool {
return enode.DistCmp(distbase, a.ID(), b.ID()) return enode.DistCmp(distbase, a.ID(), b.ID()) < 0
}) })
} }

View file

@ -302,8 +302,8 @@ func (tn *preminedTestnet) closest(n int) (nodes []*enode.Node) {
nodes = append(nodes, tn.node(d, i)) nodes = append(nodes, tn.node(d, i))
} }
} }
slices.SortFunc(nodes, func(a, b *enode.Node) int { slices.SortFunc(nodes, func(a, b *enode.Node) bool {
return enode.DistCmp(tn.target.id(), a.ID(), b.ID()) return enode.DistCmp(tn.target.id(), a.ID(), b.ID()) < 0
}) })
return nodes[:n] return nodes[:n]
} }

View file

@ -61,8 +61,8 @@ func TestUDPv5_lookupE2E(t *testing.T) {
for i := range nodes { for i := range nodes {
expectedResult[i] = nodes[i].Self() expectedResult[i] = nodes[i].Self()
} }
slices.SortFunc(expectedResult, func(a, b *enode.Node) int { slices.SortFunc(expectedResult, func(a, b *enode.Node) bool {
return enode.DistCmp(target.ID(), a.ID(), b.ID()) return enode.DistCmp(target.ID(), a.ID(), b.ID()) < 0
}) })
// Do the lookup. // Do the lookup.

View file

@ -214,8 +214,8 @@ func (t *Tree) build(entries []entry) entry {
} }
func sortByID(nodes []*enode.Node) []*enode.Node { func sortByID(nodes []*enode.Node) []*enode.Node {
slices.SortFunc(nodes, func(a, b *enode.Node) int { slices.SortFunc(nodes, func(a, b *enode.Node) bool {
return bytes.Compare(a.ID().Bytes(), b.ID().Bytes()) return bytes.Compare(a.ID().Bytes(), b.ID().Bytes()) < 0
}) })
return nodes return nodes
} }

View file

@ -386,7 +386,7 @@ func countMatchingProtocols(protocols []Protocol, caps []Cap) int {
// matchProtocols creates structures for matching named subprotocols. // matchProtocols creates structures for matching named subprotocols.
func matchProtocols(protocols []Protocol, caps []Cap, rw MsgReadWriter) map[string]*protoRW { func matchProtocols(protocols []Protocol, caps []Cap, rw MsgReadWriter) map[string]*protoRW {
slices.SortFunc(caps, Cap.Cmp) slices.SortFunc(caps, Cap.Less)
offset := baseProtocolLength offset := baseProtocolLength
result := make(map[string]*protoRW) result := make(map[string]*protoRW)

View file

@ -18,7 +18,6 @@ package p2p
import ( import (
"fmt" "fmt"
"strings"
"github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/p2p/enode"
"github.com/ethereum/go-ethereum/p2p/enr" "github.com/ethereum/go-ethereum/p2p/enr"
@ -78,16 +77,10 @@ func (cap Cap) String() string {
return fmt.Sprintf("%s/%d", cap.Name, cap.Version) return fmt.Sprintf("%s/%d", cap.Name, cap.Version)
} }
// Cmp defines the canonical sorting order of capabilities. // Less defines the canonical sorting order of capabilities.
func (cap Cap) Cmp(other Cap) int { func (cap Cap) Less(other Cap) bool {
if cap.Name == other.Name { if cap.Name == other.Name {
if cap.Version < other.Version { return cap.Version < other.Version
return -1
}
if cap.Version > other.Version {
return 1
}
return 0
} }
return strings.Compare(cap.Name, other.Name) return cap.Name < other.Name
} }

View file

@ -510,7 +510,7 @@ func (srv *Server) setupLocalNode() error {
for _, p := range srv.Protocols { for _, p := range srv.Protocols {
srv.ourHandshake.Caps = append(srv.ourHandshake.Caps, p.cap()) srv.ourHandshake.Caps = append(srv.ourHandshake.Caps, p.cap())
} }
slices.SortFunc(srv.ourHandshake.Caps, Cap.Cmp) slices.SortFunc(srv.ourHandshake.Caps, Cap.Less)
// Create the local node. // Create the local node.
db, err := enode.OpenDB(srv.NodeDatabase) db, err := enode.OpenDB(srv.NodeDatabase)

View file

@ -98,8 +98,8 @@ func (f *fuzzer) fuzz() int {
if len(entries) <= 1 { if len(entries) <= 1 {
return 0 return 0
} }
slices.SortFunc(entries, func(a, b *kv) int { slices.SortFunc(entries, func(a, b *kv) bool {
return bytes.Compare(a.k, b.k) return bytes.Compare(a.k, b.k) < 0
}) })
var ok = 0 var ok = 0

View file

@ -182,8 +182,8 @@ func (f *fuzzer) fuzz() int {
dbA.Commit(rootA, false) dbA.Commit(rootA, false)
// Stacktrie requires sorted insertion // Stacktrie requires sorted insertion
slices.SortFunc(vals, func(a, b kv) int { slices.SortFunc(vals, func(a, b kv) bool {
return bytes.Compare(a.k, b.k) return bytes.Compare(a.k, b.k) < 0
}) })
for _, kv := range vals { for _, kv := range vals {
if f.debugging { if f.debugging {

View file

@ -81,8 +81,8 @@ type kv struct {
t bool t bool
} }
func (k *kv) cmp(other *kv) int { func (k *kv) less(other *kv) bool {
return bytes.Compare(k.k, other.k) return bytes.Compare(k.k, other.k) < 0
} }
func TestIteratorLargeData(t *testing.T) { func TestIteratorLargeData(t *testing.T) {

View file

@ -173,7 +173,7 @@ func TestRangeProof(t *testing.T) {
for _, kv := range vals { for _, kv := range vals {
entries = append(entries, kv) entries = append(entries, kv)
} }
slices.SortFunc(entries, (*kv).cmp) slices.SortFunc(entries, (*kv).less)
for i := 0; i < 500; i++ { for i := 0; i < 500; i++ {
start := mrand.Intn(len(entries)) start := mrand.Intn(len(entries))
end := mrand.Intn(len(entries)-start) + start + 1 end := mrand.Intn(len(entries)-start) + start + 1
@ -206,7 +206,7 @@ func TestRangeProofWithNonExistentProof(t *testing.T) {
for _, kv := range vals { for _, kv := range vals {
entries = append(entries, kv) entries = append(entries, kv)
} }
slices.SortFunc(entries, (*kv).cmp) slices.SortFunc(entries, (*kv).less)
for i := 0; i < 500; i++ { for i := 0; i < 500; i++ {
start := mrand.Intn(len(entries)) start := mrand.Intn(len(entries))
end := mrand.Intn(len(entries)-start) + start + 1 end := mrand.Intn(len(entries)-start) + start + 1
@ -278,7 +278,7 @@ func TestRangeProofWithInvalidNonExistentProof(t *testing.T) {
for _, kv := range vals { for _, kv := range vals {
entries = append(entries, kv) entries = append(entries, kv)
} }
slices.SortFunc(entries, (*kv).cmp) slices.SortFunc(entries, (*kv).less)
// Case 1 // Case 1
start, end := 100, 200 start, end := 100, 200
@ -335,7 +335,7 @@ func TestOneElementRangeProof(t *testing.T) {
for _, kv := range vals { for _, kv := range vals {
entries = append(entries, kv) entries = append(entries, kv)
} }
slices.SortFunc(entries, (*kv).cmp) slices.SortFunc(entries, (*kv).less)
// One element with existent edge proof, both edge proofs // One element with existent edge proof, both edge proofs
// point to the SAME key. // point to the SAME key.
@ -422,7 +422,7 @@ func TestAllElementsProof(t *testing.T) {
for _, kv := range vals { for _, kv := range vals {
entries = append(entries, kv) entries = append(entries, kv)
} }
slices.SortFunc(entries, (*kv).cmp) slices.SortFunc(entries, (*kv).less)
var k [][]byte var k [][]byte
var v [][]byte var v [][]byte
@ -474,7 +474,7 @@ func TestSingleSideRangeProof(t *testing.T) {
trie.MustUpdate(value.k, value.v) trie.MustUpdate(value.k, value.v)
entries = append(entries, value) entries = append(entries, value)
} }
slices.SortFunc(entries, (*kv).cmp) slices.SortFunc(entries, (*kv).less)
var cases = []int{0, 1, 50, 100, 1000, 2000, len(entries) - 1} var cases = []int{0, 1, 50, 100, 1000, 2000, len(entries) - 1}
for _, pos := range cases { for _, pos := range cases {
@ -509,7 +509,7 @@ func TestReverseSingleSideRangeProof(t *testing.T) {
trie.MustUpdate(value.k, value.v) trie.MustUpdate(value.k, value.v)
entries = append(entries, value) entries = append(entries, value)
} }
slices.SortFunc(entries, (*kv).cmp) slices.SortFunc(entries, (*kv).less)
var cases = []int{0, 1, 50, 100, 1000, 2000, len(entries) - 1} var cases = []int{0, 1, 50, 100, 1000, 2000, len(entries) - 1}
for _, pos := range cases { for _, pos := range cases {
@ -543,7 +543,7 @@ func TestBadRangeProof(t *testing.T) {
for _, kv := range vals { for _, kv := range vals {
entries = append(entries, kv) entries = append(entries, kv)
} }
slices.SortFunc(entries, (*kv).cmp) slices.SortFunc(entries, (*kv).less)
for i := 0; i < 500; i++ { for i := 0; i < 500; i++ {
start := mrand.Intn(len(entries)) start := mrand.Intn(len(entries))
@ -646,7 +646,7 @@ func TestSameSideProofs(t *testing.T) {
for _, kv := range vals { for _, kv := range vals {
entries = append(entries, kv) entries = append(entries, kv)
} }
slices.SortFunc(entries, (*kv).cmp) slices.SortFunc(entries, (*kv).less)
pos := 1000 pos := 1000
first := decreaseKey(common.CopyBytes(entries[pos].k)) first := decreaseKey(common.CopyBytes(entries[pos].k))
@ -690,7 +690,7 @@ func TestHasRightElement(t *testing.T) {
trie.MustUpdate(value.k, value.v) trie.MustUpdate(value.k, value.v)
entries = append(entries, value) entries = append(entries, value)
} }
slices.SortFunc(entries, (*kv).cmp) slices.SortFunc(entries, (*kv).less)
var cases = []struct { var cases = []struct {
start int start int
@ -762,7 +762,7 @@ func TestEmptyRangeProof(t *testing.T) {
for _, kv := range vals { for _, kv := range vals {
entries = append(entries, kv) entries = append(entries, kv)
} }
slices.SortFunc(entries, (*kv).cmp) slices.SortFunc(entries, (*kv).less)
var cases = []struct { var cases = []struct {
pos int pos int
@ -797,7 +797,7 @@ func TestBloatedProof(t *testing.T) {
for _, kv := range kvs { for _, kv := range kvs {
entries = append(entries, kv) entries = append(entries, kv)
} }
slices.SortFunc(entries, (*kv).cmp) slices.SortFunc(entries, (*kv).less)
var keys [][]byte var keys [][]byte
var vals [][]byte var vals [][]byte
@ -831,7 +831,7 @@ func TestEmptyValueRangeProof(t *testing.T) {
for _, kv := range values { for _, kv := range values {
entries = append(entries, kv) entries = append(entries, kv)
} }
slices.SortFunc(entries, (*kv).cmp) slices.SortFunc(entries, (*kv).less)
// Create a new entry with a slightly modified key // Create a new entry with a slightly modified key
mid := len(entries) / 2 mid := len(entries) / 2
@ -875,7 +875,7 @@ func TestAllElementsEmptyValueRangeProof(t *testing.T) {
for _, kv := range values { for _, kv := range values {
entries = append(entries, kv) entries = append(entries, kv)
} }
slices.SortFunc(entries, (*kv).cmp) slices.SortFunc(entries, (*kv).less)
// Create a new entry with a slightly modified key // Create a new entry with a slightly modified key
mid := len(entries) / 2 mid := len(entries) / 2
@ -981,7 +981,7 @@ func benchmarkVerifyRangeProof(b *testing.B, size int) {
for _, kv := range vals { for _, kv := range vals {
entries = append(entries, kv) entries = append(entries, kv)
} }
slices.SortFunc(entries, (*kv).cmp) slices.SortFunc(entries, (*kv).less)
start := 2 start := 2
end := start + size end := start + size
@ -1018,7 +1018,7 @@ func benchmarkVerifyRangeNoProof(b *testing.B, size int) {
for _, kv := range vals { for _, kv := range vals {
entries = append(entries, kv) entries = append(entries, kv)
} }
slices.SortFunc(entries, (*kv).cmp) slices.SortFunc(entries, (*kv).less)
var keys [][]byte var keys [][]byte
var values [][]byte var values [][]byte

View file

@ -262,20 +262,20 @@ func newHistory(root common.Hash, parent common.Hash, block uint64, states *trie
for addr := range states.Accounts { for addr := range states.Accounts {
accountList = append(accountList, addr) accountList = append(accountList, addr)
} }
slices.SortFunc(accountList, common.Address.Cmp) slices.SortFunc(accountList, func(a, b common.Address) bool { return a.Less(b) })
for addr, slots := range states.Storages { for addr, slots := range states.Storages {
slist := make([]common.Hash, 0, len(slots)) slist := make([]common.Hash, 0, len(slots))
for slotHash := range slots { for slotHash := range slots {
slist = append(slist, slotHash) slist = append(slist, slotHash)
} }
slices.SortFunc(slist, common.Hash.Cmp) slices.SortFunc(slist, func(a, b common.Hash) bool { return a.Less(b) })
storageList[addr] = slist storageList[addr] = slist
} }
for addr := range states.Incomplete { for addr := range states.Incomplete {
incomplete = append(incomplete, addr) incomplete = append(incomplete, addr)
} }
slices.SortFunc(incomplete, common.Address.Cmp) slices.SortFunc(incomplete, func(a, b common.Address) bool { return a.Less(b) })
return &history{ return &history{
meta: &meta{ meta: &meta{

View file

@ -117,7 +117,7 @@ func hash(states map[common.Hash][]byte) (common.Hash, []byte) {
for hash := range states { for hash := range states {
hs = append(hs, hash) hs = append(hs, hash)
} }
slices.SortFunc(hs, common.Hash.Cmp) slices.SortFunc(hs, func(a, b common.Hash) bool { return a.Less(b) })
var input []byte var input []byte
for _, hash := range hs { for _, hash := range hs {

View file

@ -18,10 +18,10 @@ package trienode
import ( import (
"fmt" "fmt"
"sort"
"strings" "strings"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"golang.org/x/exp/slices"
) )
// Node is a wrapper which contains the encoded blob of the trie node and its // Node is a wrapper which contains the encoded blob of the trie node and its
@ -83,7 +83,9 @@ func (set *NodeSet) ForEachWithOrder(callback func(path string, n *Node)) {
paths = append(paths, path) paths = append(paths, path)
} }
// Bottom-up, the longest path first // Bottom-up, the longest path first
sort.Sort(sort.Reverse(sort.StringSlice(paths))) slices.SortFunc(paths, func(a, b string) bool {
return a > b // Sort in reverse order
})
for _, path := range paths { for _, path := range paths {
callback(path, set.Nodes[path]) callback(path, set.Nodes[path])
} }