Skip to content

Commit f2a51d3

Browse files
json: simplify omitempty handling
1 parent 8828185 commit f2a51d3

File tree

1 file changed

+17
-40
lines changed

1 file changed

+17
-40
lines changed

json/codec.go

Lines changed: 17 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -896,63 +896,40 @@ func isValidTag(s string) bool {
896896
}
897897

898898
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-
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+
956933
type iface struct {
957934
typ unsafe.Pointer
958935
ptr unsafe.Pointer

0 commit comments

Comments
 (0)