|
@@ -24,7 +24,6 @@ import (
|
|
|
"os"
|
|
"os"
|
|
|
"reflect"
|
|
"reflect"
|
|
|
"regexp"
|
|
"regexp"
|
|
|
- "sort"
|
|
|
|
|
"strconv"
|
|
"strconv"
|
|
|
"strings"
|
|
"strings"
|
|
|
)
|
|
)
|
|
@@ -242,46 +241,6 @@ func (d *dumpState) dumpSlice(v reflect.Value) {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-type valuesSorter struct {
|
|
|
|
|
- values []reflect.Value
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-func (s *valuesSorter) Len() int {
|
|
|
|
|
- return len(s.values)
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-func (s *valuesSorter) Swap(i, j int) {
|
|
|
|
|
- s.values[i], s.values[j] = s.values[j], s.values[i]
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-func (s *valuesSorter) Less(i, j int) bool {
|
|
|
|
|
- switch s.values[i].Kind() {
|
|
|
|
|
- case reflect.Bool:
|
|
|
|
|
- return !s.values[i].Bool() && s.values[j].Bool()
|
|
|
|
|
- case reflect.Float32, reflect.Float64:
|
|
|
|
|
- return s.values[i].Float() < s.values[j].Float()
|
|
|
|
|
- case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int:
|
|
|
|
|
- return s.values[i].Int() < s.values[j].Int()
|
|
|
|
|
- case reflect.String:
|
|
|
|
|
- return s.values[i].String() < s.values[j].String()
|
|
|
|
|
- case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint:
|
|
|
|
|
- return s.values[i].Uint() < s.values[j].Uint()
|
|
|
|
|
- case reflect.Uintptr:
|
|
|
|
|
- return s.values[i].UnsafeAddr() < s.values[j].UnsafeAddr()
|
|
|
|
|
- }
|
|
|
|
|
- return s.values[i].String() < s.values[j].String()
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// SortValues is a generic sort function for native types: int, uint, bool,
|
|
|
|
|
-// string and uintptr. Other inputs are sorted according to their
|
|
|
|
|
-// Value.String() value to ensure display stability.
|
|
|
|
|
-func SortValues(values []reflect.Value) {
|
|
|
|
|
- if len(values) == 0 {
|
|
|
|
|
- return
|
|
|
|
|
- }
|
|
|
|
|
- sort.Sort(&valuesSorter{values})
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
// dump is the main workhorse for dumping a value. It uses the passed reflect
|
|
// dump is the main workhorse for dumping a value. It uses the passed reflect
|
|
|
// value to figure out what kind of object we are dealing with and formats it
|
|
// value to figure out what kind of object we are dealing with and formats it
|
|
|
// appropriately. It is a recursive function, however circular data structures
|
|
// appropriately. It is a recursive function, however circular data structures
|
|
@@ -391,7 +350,7 @@ func (d *dumpState) dump(v reflect.Value) {
|
|
|
numEntries := v.Len()
|
|
numEntries := v.Len()
|
|
|
keys := v.MapKeys()
|
|
keys := v.MapKeys()
|
|
|
if d.cs.SortKeys {
|
|
if d.cs.SortKeys {
|
|
|
- SortValues(keys)
|
|
|
|
|
|
|
+ sortValues(keys)
|
|
|
}
|
|
}
|
|
|
for i, key := range keys {
|
|
for i, key := range keys {
|
|
|
d.dump(d.unpackValue(key))
|
|
d.dump(d.unpackValue(key))
|