mirror of
https://github.com/protocolbuffers/protobuf-go.git
synced 2025-02-19 12:40:24 +00:00
internal/impl: omit isInit func when not needed
When generating the fast-path functions for a message, group, repeated message, or repeated group field, check to see if the field message type requires initialization checks. If not, leave the isInit func unset. This permits the fast-path isInitialized to skip over these fields entirely. Change-Id: Icb5c380077d2216c4215bb0ebc16408e905aaece Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/214179 Reviewed-by: Joe Tsai <joetsai@google.com>
This commit is contained in:
parent
025a0d2da1
commit
7abc2def69
@ -164,7 +164,7 @@ func makeWeakMessageFieldCoder(fd pref.FieldDescriptor) pointerCoderFuncs {
|
||||
|
||||
func makeMessageFieldCoder(fd pref.FieldDescriptor, ft reflect.Type) pointerCoderFuncs {
|
||||
if mi := getMessageInfo(ft); mi != nil {
|
||||
return pointerCoderFuncs{
|
||||
funcs := pointerCoderFuncs{
|
||||
size: func(p pointer, tagsize int, opts marshalOptions) int {
|
||||
return sizeMessageInfo(p, mi, tagsize, opts)
|
||||
},
|
||||
@ -174,10 +174,13 @@ func makeMessageFieldCoder(fd pref.FieldDescriptor, ft reflect.Type) pointerCode
|
||||
unmarshal: func(b []byte, p pointer, wtyp wire.Type, opts unmarshalOptions) (int, error) {
|
||||
return consumeMessageInfo(b, p, mi, wtyp, opts)
|
||||
},
|
||||
isInit: func(p pointer) error {
|
||||
return mi.isInitializedPointer(p.Elem())
|
||||
},
|
||||
}
|
||||
if needsInitCheck(mi.Desc) {
|
||||
funcs.isInit = func(p pointer) error {
|
||||
return mi.isInitializedPointer(p.Elem())
|
||||
}
|
||||
}
|
||||
return funcs
|
||||
} else {
|
||||
return pointerCoderFuncs{
|
||||
size: func(p pointer, tagsize int, opts marshalOptions) int {
|
||||
@ -308,7 +311,7 @@ var coderGroupValue = valueCoderFuncs{
|
||||
func makeGroupFieldCoder(fd pref.FieldDescriptor, ft reflect.Type) pointerCoderFuncs {
|
||||
num := fd.Number()
|
||||
if mi := getMessageInfo(ft); mi != nil {
|
||||
return pointerCoderFuncs{
|
||||
funcs := pointerCoderFuncs{
|
||||
size: func(p pointer, tagsize int, opts marshalOptions) int {
|
||||
return sizeGroupType(p, mi, tagsize, opts)
|
||||
},
|
||||
@ -318,10 +321,13 @@ func makeGroupFieldCoder(fd pref.FieldDescriptor, ft reflect.Type) pointerCoderF
|
||||
unmarshal: func(b []byte, p pointer, wtyp wire.Type, opts unmarshalOptions) (int, error) {
|
||||
return consumeGroupType(b, p, mi, num, wtyp, opts)
|
||||
},
|
||||
isInit: func(p pointer) error {
|
||||
return mi.isInitializedPointer(p.Elem())
|
||||
},
|
||||
}
|
||||
if needsInitCheck(mi.Desc) {
|
||||
funcs.isInit = func(p pointer) error {
|
||||
return mi.isInitializedPointer(p.Elem())
|
||||
}
|
||||
}
|
||||
return funcs
|
||||
} else {
|
||||
return pointerCoderFuncs{
|
||||
size: func(p pointer, tagsize int, opts marshalOptions) int {
|
||||
@ -392,7 +398,7 @@ func consumeGroup(b []byte, m proto.Message, num wire.Number, wtyp wire.Type, op
|
||||
|
||||
func makeMessageSliceFieldCoder(fd pref.FieldDescriptor, ft reflect.Type) pointerCoderFuncs {
|
||||
if mi := getMessageInfo(ft); mi != nil {
|
||||
return pointerCoderFuncs{
|
||||
funcs := pointerCoderFuncs{
|
||||
size: func(p pointer, tagsize int, opts marshalOptions) int {
|
||||
return sizeMessageSliceInfo(p, mi, tagsize, opts)
|
||||
},
|
||||
@ -402,10 +408,13 @@ func makeMessageSliceFieldCoder(fd pref.FieldDescriptor, ft reflect.Type) pointe
|
||||
unmarshal: func(b []byte, p pointer, wtyp wire.Type, opts unmarshalOptions) (int, error) {
|
||||
return consumeMessageSliceInfo(b, p, mi, wtyp, opts)
|
||||
},
|
||||
isInit: func(p pointer) error {
|
||||
return isInitMessageSliceInfo(p, mi)
|
||||
},
|
||||
}
|
||||
if needsInitCheck(mi.Desc) {
|
||||
funcs.isInit = func(p pointer) error {
|
||||
return isInitMessageSliceInfo(p, mi)
|
||||
}
|
||||
}
|
||||
return funcs
|
||||
}
|
||||
return pointerCoderFuncs{
|
||||
size: func(p pointer, tagsize int, opts marshalOptions) int {
|
||||
@ -644,7 +653,7 @@ var coderGroupSliceValue = valueCoderFuncs{
|
||||
func makeGroupSliceFieldCoder(fd pref.FieldDescriptor, ft reflect.Type) pointerCoderFuncs {
|
||||
num := fd.Number()
|
||||
if mi := getMessageInfo(ft); mi != nil {
|
||||
return pointerCoderFuncs{
|
||||
funcs := pointerCoderFuncs{
|
||||
size: func(p pointer, tagsize int, opts marshalOptions) int {
|
||||
return sizeGroupSliceInfo(p, mi, tagsize, opts)
|
||||
},
|
||||
@ -654,10 +663,13 @@ func makeGroupSliceFieldCoder(fd pref.FieldDescriptor, ft reflect.Type) pointerC
|
||||
unmarshal: func(b []byte, p pointer, wtyp wire.Type, opts unmarshalOptions) (int, error) {
|
||||
return consumeGroupSliceInfo(b, p, num, wtyp, mi, opts)
|
||||
},
|
||||
isInit: func(p pointer) error {
|
||||
return isInitMessageSliceInfo(p, mi)
|
||||
},
|
||||
}
|
||||
if needsInitCheck(mi.Desc) {
|
||||
funcs.isInit = func(p pointer) error {
|
||||
return isInitMessageSliceInfo(p, mi)
|
||||
}
|
||||
}
|
||||
return funcs
|
||||
}
|
||||
return pointerCoderFuncs{
|
||||
size: func(p pointer, tagsize int, opts marshalOptions) int {
|
||||
|
Loading…
x
Reference in New Issue
Block a user