mirror of https://github.com/golang/go.git
cmd/compile: start using reflect.Value.IsZero
We now require Go 1.17.13 to bootstrap via make.bash, and since reflect.Value.IsZero was added in Go 1.13, we can now use it directly to save a bit of copy pasting. Change-Id: I77eef782cbbf86c72a4505c8b4866c9658914a24 Reviewed-on: https://go-review.googlesource.com/c/go/+/479395 Reviewed-by: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org> Reviewed-by: Keith Randall <khr@google.com> Run-TryBot: Daniel Martí <mvdan@mvdan.cc>
This commit is contained in:
parent
524f820b7f
commit
fc99c4b3f3
|
|
@ -218,7 +218,7 @@ func (p *dumper) dump(x reflect.Value, depth int) {
|
||||||
continue // Op field already printed for Nodes
|
continue // Op field already printed for Nodes
|
||||||
}
|
}
|
||||||
x := x.Field(i)
|
x := x.Field(i)
|
||||||
if isZeroVal(x) {
|
if x.IsZero() {
|
||||||
omitted = true
|
omitted = true
|
||||||
continue // exclude zero-valued fields
|
continue // exclude zero-valued fields
|
||||||
}
|
}
|
||||||
|
|
@ -248,22 +248,6 @@ func (p *dumper) dump(x reflect.Value, depth int) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func isZeroVal(x reflect.Value) bool {
|
|
||||||
switch x.Kind() {
|
|
||||||
case reflect.Bool:
|
|
||||||
return !x.Bool()
|
|
||||||
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
|
||||||
return x.Int() == 0
|
|
||||||
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
|
|
||||||
return x.Uint() == 0
|
|
||||||
case reflect.String:
|
|
||||||
return x.String() == ""
|
|
||||||
case reflect.Interface, reflect.Ptr, reflect.Slice:
|
|
||||||
return x.IsNil()
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func commonPrefixLen(a, b string) (i int) {
|
func commonPrefixLen(a, b string) (i int) {
|
||||||
for i < len(a) && i < len(b) && a[i] == b[i] {
|
for i < len(a) && i < len(b) && a[i] == b[i] {
|
||||||
i++
|
i++
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,6 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"go/constant"
|
"go/constant"
|
||||||
"io"
|
"io"
|
||||||
"math"
|
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
|
@ -1022,7 +1021,7 @@ func dumpNodeHeader(w io.Writer, n Node) {
|
||||||
name := strings.TrimSuffix(tf.Name, "_")
|
name := strings.TrimSuffix(tf.Name, "_")
|
||||||
vf := v.Field(i)
|
vf := v.Field(i)
|
||||||
vfi := vf.Interface()
|
vfi := vf.Interface()
|
||||||
if name == "Offset" && vfi == types.BADWIDTH || name != "Offset" && isZero(vf) {
|
if name == "Offset" && vfi == types.BADWIDTH || name != "Offset" && vf.IsZero() {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if vfi == true {
|
if vfi == true {
|
||||||
|
|
@ -1261,40 +1260,3 @@ func dumpNodes(w io.Writer, list Nodes, depth int) {
|
||||||
dumpNode(w, n, depth)
|
dumpNode(w, n, depth)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// reflect.IsZero is not available in Go 1.4 (added in Go 1.13), so we use this copy instead.
|
|
||||||
func isZero(v reflect.Value) bool {
|
|
||||||
switch v.Kind() {
|
|
||||||
case reflect.Bool:
|
|
||||||
return !v.Bool()
|
|
||||||
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
|
||||||
return v.Int() == 0
|
|
||||||
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
|
|
||||||
return v.Uint() == 0
|
|
||||||
case reflect.Float32, reflect.Float64:
|
|
||||||
return math.Float64bits(v.Float()) == 0
|
|
||||||
case reflect.Complex64, reflect.Complex128:
|
|
||||||
c := v.Complex()
|
|
||||||
return math.Float64bits(real(c)) == 0 && math.Float64bits(imag(c)) == 0
|
|
||||||
case reflect.Array:
|
|
||||||
for i := 0; i < v.Len(); i++ {
|
|
||||||
if !isZero(v.Index(i)) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice, reflect.UnsafePointer:
|
|
||||||
return v.IsNil()
|
|
||||||
case reflect.String:
|
|
||||||
return v.Len() == 0
|
|
||||||
case reflect.Struct:
|
|
||||||
for i := 0; i < v.NumField(); i++ {
|
|
||||||
if !isZero(v.Field(i)) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
default:
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue