mirror of
https://github.com/protocolbuffers/protobuf-go.git
synced 2025-02-22 03:40:55 +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 {
|
func makeMessageFieldCoder(fd pref.FieldDescriptor, ft reflect.Type) pointerCoderFuncs {
|
||||||
if mi := getMessageInfo(ft); mi != nil {
|
if mi := getMessageInfo(ft); mi != nil {
|
||||||
return pointerCoderFuncs{
|
funcs := pointerCoderFuncs{
|
||||||
size: func(p pointer, tagsize int, opts marshalOptions) int {
|
size: func(p pointer, tagsize int, opts marshalOptions) int {
|
||||||
return sizeMessageInfo(p, mi, tagsize, opts)
|
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) {
|
unmarshal: func(b []byte, p pointer, wtyp wire.Type, opts unmarshalOptions) (int, error) {
|
||||||
return consumeMessageInfo(b, p, mi, wtyp, opts)
|
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 {
|
} else {
|
||||||
return pointerCoderFuncs{
|
return pointerCoderFuncs{
|
||||||
size: func(p pointer, tagsize int, opts marshalOptions) int {
|
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 {
|
func makeGroupFieldCoder(fd pref.FieldDescriptor, ft reflect.Type) pointerCoderFuncs {
|
||||||
num := fd.Number()
|
num := fd.Number()
|
||||||
if mi := getMessageInfo(ft); mi != nil {
|
if mi := getMessageInfo(ft); mi != nil {
|
||||||
return pointerCoderFuncs{
|
funcs := pointerCoderFuncs{
|
||||||
size: func(p pointer, tagsize int, opts marshalOptions) int {
|
size: func(p pointer, tagsize int, opts marshalOptions) int {
|
||||||
return sizeGroupType(p, mi, tagsize, opts)
|
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) {
|
unmarshal: func(b []byte, p pointer, wtyp wire.Type, opts unmarshalOptions) (int, error) {
|
||||||
return consumeGroupType(b, p, mi, num, wtyp, opts)
|
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 {
|
} else {
|
||||||
return pointerCoderFuncs{
|
return pointerCoderFuncs{
|
||||||
size: func(p pointer, tagsize int, opts marshalOptions) int {
|
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 {
|
func makeMessageSliceFieldCoder(fd pref.FieldDescriptor, ft reflect.Type) pointerCoderFuncs {
|
||||||
if mi := getMessageInfo(ft); mi != nil {
|
if mi := getMessageInfo(ft); mi != nil {
|
||||||
return pointerCoderFuncs{
|
funcs := pointerCoderFuncs{
|
||||||
size: func(p pointer, tagsize int, opts marshalOptions) int {
|
size: func(p pointer, tagsize int, opts marshalOptions) int {
|
||||||
return sizeMessageSliceInfo(p, mi, tagsize, opts)
|
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) {
|
unmarshal: func(b []byte, p pointer, wtyp wire.Type, opts unmarshalOptions) (int, error) {
|
||||||
return consumeMessageSliceInfo(b, p, mi, wtyp, opts)
|
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{
|
return pointerCoderFuncs{
|
||||||
size: func(p pointer, tagsize int, opts marshalOptions) int {
|
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 {
|
func makeGroupSliceFieldCoder(fd pref.FieldDescriptor, ft reflect.Type) pointerCoderFuncs {
|
||||||
num := fd.Number()
|
num := fd.Number()
|
||||||
if mi := getMessageInfo(ft); mi != nil {
|
if mi := getMessageInfo(ft); mi != nil {
|
||||||
return pointerCoderFuncs{
|
funcs := pointerCoderFuncs{
|
||||||
size: func(p pointer, tagsize int, opts marshalOptions) int {
|
size: func(p pointer, tagsize int, opts marshalOptions) int {
|
||||||
return sizeGroupSliceInfo(p, mi, tagsize, opts)
|
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) {
|
unmarshal: func(b []byte, p pointer, wtyp wire.Type, opts unmarshalOptions) (int, error) {
|
||||||
return consumeGroupSliceInfo(b, p, num, wtyp, mi, opts)
|
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{
|
return pointerCoderFuncs{
|
||||||
size: func(p pointer, tagsize int, opts marshalOptions) int {
|
size: func(p pointer, tagsize int, opts marshalOptions) int {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user