summaryrefslogtreecommitdiff
path: root/vendor/github.com/bytedance/sonic/internal/resolver/resolver.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/bytedance/sonic/internal/resolver/resolver.go')
-rw-r--r--vendor/github.com/bytedance/sonic/internal/resolver/resolver.go32
1 files changed, 18 insertions, 14 deletions
diff --git a/vendor/github.com/bytedance/sonic/internal/resolver/resolver.go b/vendor/github.com/bytedance/sonic/internal/resolver/resolver.go
index 795434f4e..1c30ad113 100644
--- a/vendor/github.com/bytedance/sonic/internal/resolver/resolver.go
+++ b/vendor/github.com/bytedance/sonic/internal/resolver/resolver.go
@@ -17,10 +17,10 @@
package resolver
import (
- `fmt`
- `reflect`
- `strings`
- `sync`
+ "fmt"
+ "reflect"
+ "strings"
+ "sync"
)
type FieldOpts int
@@ -29,6 +29,7 @@ type OffsetType int
const (
F_omitempty FieldOpts = 1 << iota
F_stringize
+ F_omitzero
)
const (
@@ -47,6 +48,7 @@ type FieldMeta struct {
Path []Offset
Opts FieldOpts
Type reflect.Type
+ IsZero func(reflect.Value) bool
}
func (self *FieldMeta) String() string {
@@ -117,20 +119,26 @@ func resolveFields(vt reflect.Type) []FieldMeta {
/* convert each field */
for _, fv := range tfv.list {
+ /* add to result */
+ ret = append(ret, FieldMeta{})
+ fm := &ret[len(ret)-1]
+
item := vt
path := []Offset(nil)
- opts := FieldOpts(0)
/* check for "string" */
if fv.quoted {
- opts |= F_stringize
+ fm.Opts |= F_stringize
}
/* check for "omitempty" */
if fv.omitEmpty {
- opts |= F_omitempty
+ fm.Opts |= F_omitempty
}
+ /* handle the "omitzero" */
+ handleOmitZero(fv, fm)
+
/* dump the field path */
for _, i := range fv.index {
kind := F_offset
@@ -161,13 +169,9 @@ func resolveFields(vt reflect.Type) []FieldMeta {
path[idx].Kind = F_offset
}
- /* add to result */
- ret = append(ret, FieldMeta {
- Type: fvt,
- Opts: opts,
- Path: path,
- Name: fv.name,
- })
+ fm.Type = fvt
+ fm.Path = path
+ fm.Name = fv.name
}
/* optimize the offsets */