mirror of
https://github.com/protocolbuffers/protobuf-go.git
synced 2025-02-07 03:40:29 +00:00
9d637ca923
This change performs two optimizations: * It uses a pre-constructed rangeInfos slice to iterate over all the fields. This is more performant since iterating over a slice is faster than iterating over a map. Furthermore, this slice does not contain fields that are part of a oneof. If a oneof has N fields, the time to check presence on the oneof is now O(1) instead of O(N). * It uses a dense field info slice that is optmized for the common case where the field number is relatively low and close in value to the index itself. We also fix a minor bug in the construction of oneofInfo where it wasn't treating a typed nil pointer to a wrapper struct as if it were unset. This ensures WhichOneof and Has always agree. name old time/op new time/op delta Reflect/Has-4 7.81µs ± 3% 6.74µs ± 3% -13.61% (p=0.000 n=9+9) Reflect/Get-4 12.7µs ± 1% 11.3µs ± 4% -10.85% (p=0.000 n=8+10) Reflect/Set-4 19.5µs ± 5% 17.8µs ± 2% -8.99% (p=0.000 n=10+10) Reflect/Clear-4 12.0µs ± 4% 10.2µs ± 3% -14.86% (p=0.000 n=9+10) Reflect/Range-4 6.58µs ± 1% 4.17µs ± 2% -36.65% (p=0.000 n=8+9) Change-Id: I2c48b4d3fb6103ab238924950529ded0d37f8c8a Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/196358 Reviewed-by: Damien Neil <dneil@google.com>
244 lines
7.5 KiB
Go
244 lines
7.5 KiB
Go
// Copyright 2018 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style.
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// Code generated by generate-types. DO NOT EDIT.
|
|
|
|
package impl
|
|
|
|
import (
|
|
"google.golang.org/protobuf/reflect/protoreflect"
|
|
"google.golang.org/protobuf/runtime/protoiface"
|
|
)
|
|
|
|
func (m *messageState) Descriptor() protoreflect.MessageDescriptor {
|
|
return m.messageInfo().Desc
|
|
}
|
|
func (m *messageState) Type() protoreflect.MessageType {
|
|
return m.messageInfo()
|
|
}
|
|
func (m *messageState) New() protoreflect.Message {
|
|
return m.messageInfo().New()
|
|
}
|
|
func (m *messageState) Interface() protoreflect.ProtoMessage {
|
|
return m.protoUnwrap().(protoreflect.ProtoMessage)
|
|
}
|
|
func (m *messageState) protoUnwrap() interface{} {
|
|
return m.pointer().AsIfaceOf(m.messageInfo().GoReflectType.Elem())
|
|
}
|
|
func (m *messageState) ProtoMethods() *protoiface.Methods {
|
|
m.messageInfo().init()
|
|
return &m.messageInfo().methods
|
|
}
|
|
|
|
// ProtoMessageInfo is a pseudo-internal API for allowing the v1 code
|
|
// to be able to retrieve a v2 MessageInfo struct.
|
|
//
|
|
// WARNING: This method is exempt from the compatibility promise and
|
|
// may be removed in the future without warning.
|
|
func (m *messageState) ProtoMessageInfo() *MessageInfo {
|
|
return m.messageInfo()
|
|
}
|
|
|
|
func (m *messageState) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) {
|
|
m.messageInfo().init()
|
|
for _, ri := range m.messageInfo().rangeInfos {
|
|
switch ri := ri.(type) {
|
|
case *fieldInfo:
|
|
if ri.has(m.pointer()) {
|
|
if !f(ri.fieldDesc, ri.get(m.pointer())) {
|
|
return
|
|
}
|
|
}
|
|
case *oneofInfo:
|
|
if n := ri.which(m.pointer()); n > 0 {
|
|
fi := m.messageInfo().fields[n]
|
|
if !f(fi.fieldDesc, fi.get(m.pointer())) {
|
|
return
|
|
}
|
|
}
|
|
}
|
|
}
|
|
m.messageInfo().extensionMap(m.pointer()).Range(f)
|
|
}
|
|
func (m *messageState) Has(fd protoreflect.FieldDescriptor) bool {
|
|
m.messageInfo().init()
|
|
if fi, xt := m.messageInfo().checkField(fd); fi != nil {
|
|
return fi.has(m.pointer())
|
|
} else {
|
|
return m.messageInfo().extensionMap(m.pointer()).Has(xt)
|
|
}
|
|
}
|
|
func (m *messageState) Clear(fd protoreflect.FieldDescriptor) {
|
|
m.messageInfo().init()
|
|
if fi, xt := m.messageInfo().checkField(fd); fi != nil {
|
|
fi.clear(m.pointer())
|
|
} else {
|
|
m.messageInfo().extensionMap(m.pointer()).Clear(xt)
|
|
}
|
|
}
|
|
func (m *messageState) Get(fd protoreflect.FieldDescriptor) protoreflect.Value {
|
|
m.messageInfo().init()
|
|
if fi, xt := m.messageInfo().checkField(fd); fi != nil {
|
|
return fi.get(m.pointer())
|
|
} else {
|
|
return m.messageInfo().extensionMap(m.pointer()).Get(xt)
|
|
}
|
|
}
|
|
func (m *messageState) Set(fd protoreflect.FieldDescriptor, v protoreflect.Value) {
|
|
m.messageInfo().init()
|
|
if fi, xt := m.messageInfo().checkField(fd); fi != nil {
|
|
fi.set(m.pointer(), v)
|
|
} else {
|
|
m.messageInfo().extensionMap(m.pointer()).Set(xt, v)
|
|
}
|
|
}
|
|
func (m *messageState) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value {
|
|
m.messageInfo().init()
|
|
if fi, xt := m.messageInfo().checkField(fd); fi != nil {
|
|
return fi.mutable(m.pointer())
|
|
} else {
|
|
return m.messageInfo().extensionMap(m.pointer()).Mutable(xt)
|
|
}
|
|
}
|
|
func (m *messageState) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value {
|
|
m.messageInfo().init()
|
|
if fi, xt := m.messageInfo().checkField(fd); fi != nil {
|
|
return fi.newField()
|
|
} else {
|
|
return xt.New()
|
|
}
|
|
}
|
|
func (m *messageState) WhichOneof(od protoreflect.OneofDescriptor) protoreflect.FieldDescriptor {
|
|
m.messageInfo().init()
|
|
if oi := m.messageInfo().oneofs[od.Name()]; oi != nil && oi.oneofDesc == od {
|
|
return od.Fields().ByNumber(oi.which(m.pointer()))
|
|
}
|
|
panic("invalid oneof descriptor")
|
|
}
|
|
func (m *messageState) GetUnknown() protoreflect.RawFields {
|
|
m.messageInfo().init()
|
|
return m.messageInfo().getUnknown(m.pointer())
|
|
}
|
|
func (m *messageState) SetUnknown(b protoreflect.RawFields) {
|
|
m.messageInfo().init()
|
|
m.messageInfo().setUnknown(m.pointer(), b)
|
|
}
|
|
|
|
func (m *messageReflectWrapper) Descriptor() protoreflect.MessageDescriptor {
|
|
return m.messageInfo().Desc
|
|
}
|
|
func (m *messageReflectWrapper) Type() protoreflect.MessageType {
|
|
return m.messageInfo()
|
|
}
|
|
func (m *messageReflectWrapper) New() protoreflect.Message {
|
|
return m.messageInfo().New()
|
|
}
|
|
func (m *messageReflectWrapper) Interface() protoreflect.ProtoMessage {
|
|
if m, ok := m.protoUnwrap().(protoreflect.ProtoMessage); ok {
|
|
return m
|
|
}
|
|
return (*messageIfaceWrapper)(m)
|
|
}
|
|
func (m *messageReflectWrapper) protoUnwrap() interface{} {
|
|
return m.pointer().AsIfaceOf(m.messageInfo().GoReflectType.Elem())
|
|
}
|
|
func (m *messageReflectWrapper) ProtoMethods() *protoiface.Methods {
|
|
m.messageInfo().init()
|
|
return &m.messageInfo().methods
|
|
}
|
|
|
|
// ProtoMessageInfo is a pseudo-internal API for allowing the v1 code
|
|
// to be able to retrieve a v2 MessageInfo struct.
|
|
//
|
|
// WARNING: This method is exempt from the compatibility promise and
|
|
// may be removed in the future without warning.
|
|
func (m *messageReflectWrapper) ProtoMessageInfo() *MessageInfo {
|
|
return m.messageInfo()
|
|
}
|
|
|
|
func (m *messageReflectWrapper) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) {
|
|
m.messageInfo().init()
|
|
for _, ri := range m.messageInfo().rangeInfos {
|
|
switch ri := ri.(type) {
|
|
case *fieldInfo:
|
|
if ri.has(m.pointer()) {
|
|
if !f(ri.fieldDesc, ri.get(m.pointer())) {
|
|
return
|
|
}
|
|
}
|
|
case *oneofInfo:
|
|
if n := ri.which(m.pointer()); n > 0 {
|
|
fi := m.messageInfo().fields[n]
|
|
if !f(fi.fieldDesc, fi.get(m.pointer())) {
|
|
return
|
|
}
|
|
}
|
|
}
|
|
}
|
|
m.messageInfo().extensionMap(m.pointer()).Range(f)
|
|
}
|
|
func (m *messageReflectWrapper) Has(fd protoreflect.FieldDescriptor) bool {
|
|
m.messageInfo().init()
|
|
if fi, xt := m.messageInfo().checkField(fd); fi != nil {
|
|
return fi.has(m.pointer())
|
|
} else {
|
|
return m.messageInfo().extensionMap(m.pointer()).Has(xt)
|
|
}
|
|
}
|
|
func (m *messageReflectWrapper) Clear(fd protoreflect.FieldDescriptor) {
|
|
m.messageInfo().init()
|
|
if fi, xt := m.messageInfo().checkField(fd); fi != nil {
|
|
fi.clear(m.pointer())
|
|
} else {
|
|
m.messageInfo().extensionMap(m.pointer()).Clear(xt)
|
|
}
|
|
}
|
|
func (m *messageReflectWrapper) Get(fd protoreflect.FieldDescriptor) protoreflect.Value {
|
|
m.messageInfo().init()
|
|
if fi, xt := m.messageInfo().checkField(fd); fi != nil {
|
|
return fi.get(m.pointer())
|
|
} else {
|
|
return m.messageInfo().extensionMap(m.pointer()).Get(xt)
|
|
}
|
|
}
|
|
func (m *messageReflectWrapper) Set(fd protoreflect.FieldDescriptor, v protoreflect.Value) {
|
|
m.messageInfo().init()
|
|
if fi, xt := m.messageInfo().checkField(fd); fi != nil {
|
|
fi.set(m.pointer(), v)
|
|
} else {
|
|
m.messageInfo().extensionMap(m.pointer()).Set(xt, v)
|
|
}
|
|
}
|
|
func (m *messageReflectWrapper) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value {
|
|
m.messageInfo().init()
|
|
if fi, xt := m.messageInfo().checkField(fd); fi != nil {
|
|
return fi.mutable(m.pointer())
|
|
} else {
|
|
return m.messageInfo().extensionMap(m.pointer()).Mutable(xt)
|
|
}
|
|
}
|
|
func (m *messageReflectWrapper) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value {
|
|
m.messageInfo().init()
|
|
if fi, xt := m.messageInfo().checkField(fd); fi != nil {
|
|
return fi.newField()
|
|
} else {
|
|
return xt.New()
|
|
}
|
|
}
|
|
func (m *messageReflectWrapper) WhichOneof(od protoreflect.OneofDescriptor) protoreflect.FieldDescriptor {
|
|
m.messageInfo().init()
|
|
if oi := m.messageInfo().oneofs[od.Name()]; oi != nil && oi.oneofDesc == od {
|
|
return od.Fields().ByNumber(oi.which(m.pointer()))
|
|
}
|
|
panic("invalid oneof descriptor")
|
|
}
|
|
func (m *messageReflectWrapper) GetUnknown() protoreflect.RawFields {
|
|
m.messageInfo().init()
|
|
return m.messageInfo().getUnknown(m.pointer())
|
|
}
|
|
func (m *messageReflectWrapper) SetUnknown(b protoreflect.RawFields) {
|
|
m.messageInfo().init()
|
|
m.messageInfo().setUnknown(m.pointer(), b)
|
|
}
|