@@ -896,63 +896,40 @@ func isValidTag(s string) bool {
896896}
897897
898898func emptyFuncOf (t reflect.Type ) emptyFunc {
899- switch t {
900- case bytesType , rawMessageType :
901- return func (p unsafe.Pointer ) bool { return (* slice )(p ).len == 0 }
902- }
903-
904899 switch t .Kind () {
905900 case reflect .Array :
906901 if t .Len () == 0 {
907902 return func (unsafe.Pointer ) bool { return true }
908903 }
909904
910- case reflect .Map :
911- return func (p unsafe.Pointer ) bool { return reflect .NewAt (t , p ).Elem ().Len () == 0 }
912-
913- case reflect .Slice :
914- return func (p unsafe.Pointer ) bool { return (* slice )(p ).len == 0 }
915-
916- case reflect .String :
917- return func (p unsafe.Pointer ) bool { return len (* (* string )(p )) == 0 }
905+ case reflect .Map , reflect .Slice , reflect .String :
906+ return func (p unsafe.Pointer ) bool { return reflectDeref (t , p ).Len () == 0 }
918907
919908 case reflect .Bool :
920- return func (p unsafe.Pointer ) bool { return ! * (* bool )(p ) }
921-
922- case reflect .Int , reflect .Uint :
923- return func (p unsafe.Pointer ) bool { return * (* uint )(p ) == 0 }
924-
925- case reflect .Uintptr :
926- return func (p unsafe.Pointer ) bool { return * (* uintptr )(p ) == 0 }
927-
909+ fallthrough
910+ case reflect .Int , reflect .Uint , reflect .Uintptr :
911+ fallthrough
928912 case reflect .Int8 , reflect .Uint8 :
929- return func (p unsafe.Pointer ) bool { return * (* uint8 )(p ) == 0 }
930-
913+ fallthrough
931914 case reflect .Int16 , reflect .Uint16 :
932- return func (p unsafe.Pointer ) bool { return * (* uint16 )(p ) == 0 }
933-
915+ fallthrough
934916 case reflect .Int32 , reflect .Uint32 :
935- return func (p unsafe.Pointer ) bool { return * (* uint32 )(p ) == 0 }
936-
917+ fallthrough
937918 case reflect .Int64 , reflect .Uint64 :
938- return func (p unsafe.Pointer ) bool { return * (* uint64 )(p ) == 0 }
939-
940- case reflect .Float32 :
941- return func (p unsafe.Pointer ) bool { return * (* float32 )(p ) == 0 }
942-
943- case reflect .Float64 :
944- return func (p unsafe.Pointer ) bool { return * (* float64 )(p ) == 0 }
945-
946- case reflect .Ptr :
947- return func (p unsafe.Pointer ) bool { return * (* unsafe .Pointer )(p ) == nil }
948-
949- case reflect .Interface :
950- return func (p unsafe.Pointer ) bool { return (* iface )(p ).ptr == nil }
919+ fallthrough
920+ case reflect .Float32 , reflect .Float64 :
921+ fallthrough
922+ case reflect .Pointer , reflect .Interface :
923+ return func (p unsafe.Pointer ) bool { return reflectDeref (t , p ).IsZero () }
951924 }
952925
953926 return func (unsafe.Pointer ) bool { return false }
954927}
955928
929+ func reflectDeref (t reflect.Type , p unsafe.Pointer ) reflect.Value {
930+ return reflect .NewAt (t , p ).Elem ()
931+ }
932+
956933type iface struct {
957934 typ unsafe.Pointer
958935 ptr unsafe.Pointer
0 commit comments