@@ -896,63 +896,40 @@ func isValidTag(s string) bool {
896
896
}
897
897
898
898
func 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
-
904
899
switch t .Kind () {
905
900
case reflect .Array :
906
901
if t .Len () == 0 {
907
902
return func (unsafe.Pointer ) bool { return true }
908
903
}
909
904
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 }
918
907
919
908
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
928
912
case reflect .Int8 , reflect .Uint8 :
929
- return func (p unsafe.Pointer ) bool { return * (* uint8 )(p ) == 0 }
930
-
913
+ fallthrough
931
914
case reflect .Int16 , reflect .Uint16 :
932
- return func (p unsafe.Pointer ) bool { return * (* uint16 )(p ) == 0 }
933
-
915
+ fallthrough
934
916
case reflect .Int32 , reflect .Uint32 :
935
- return func (p unsafe.Pointer ) bool { return * (* uint32 )(p ) == 0 }
936
-
917
+ fallthrough
937
918
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 () }
951
924
}
952
925
953
926
return func (unsafe.Pointer ) bool { return false }
954
927
}
955
928
929
+ func reflectDeref (t reflect.Type , p unsafe.Pointer ) reflect.Value {
930
+ return reflect .NewAt (t , p ).Elem ()
931
+ }
932
+
956
933
type iface struct {
957
934
typ unsafe.Pointer
958
935
ptr unsafe.Pointer
0 commit comments