package impl
import (
)
type reflectMessageInfo struct {
fields map[protoreflect.FieldNumber]*fieldInfo
oneofs map[protoreflect.Name]*oneofInfo
fieldTypes map[protoreflect.FieldNumber]interface{}
denseFields []*fieldInfo
rangeInfos []interface{}
getUnknown func(pointer) protoreflect.RawFields
setUnknown func(pointer, protoreflect.RawFields)
extensionMap func(pointer) *extensionMap
nilMessage atomicNilMessage
}
func ( *MessageInfo) ( reflect.Type, structInfo) {
.makeKnownFieldsFunc()
.makeUnknownFieldsFunc(, )
.makeExtensionFieldsFunc(, )
.makeFieldTypes()
}
func ( *MessageInfo) ( structInfo) {
.fields = map[protoreflect.FieldNumber]*fieldInfo{}
:= .Desc
:= .Fields()
for := 0; < .Len(); ++ {
:= .Get()
:= .fieldsByNumber[.Number()]
:= .ContainingOneof() != nil && !.ContainingOneof().IsSynthetic()
if {
= .oneofsByName[.ContainingOneof().Name()]
}
var fieldInfo
switch {
case .Type == nil:
= fieldInfoForMissing()
case :
= fieldInfoForOneof(, , .Exporter, .oneofWrappersByNumber[.Number()])
case .IsMap():
= fieldInfoForMap(, , .Exporter)
case .IsList():
= fieldInfoForList(, , .Exporter)
case .IsWeak():
= fieldInfoForWeakMessage(, .weakOffset)
case .Message() != nil:
= fieldInfoForMessage(, , .Exporter)
default:
= fieldInfoForScalar(, , .Exporter)
}
.fields[.Number()] = &
}
.oneofs = map[protoreflect.Name]*oneofInfo{}
for := 0; < .Oneofs().Len(); ++ {
:= .Oneofs().Get()
.oneofs[.Name()] = makeOneofInfo(, , .Exporter)
}
.denseFields = make([]*fieldInfo, .Len()*2)
for := 0; < .Len(); ++ {
if := .Get(); int(.Number()) < len(.denseFields) {
.denseFields[.Number()] = .fields[.Number()]
}
}
for := 0; < .Len(); {
:= .Get()
if := .ContainingOneof(); != nil && !.IsSynthetic() {
.rangeInfos = append(.rangeInfos, .oneofs[.Name()])
+= .Fields().Len()
} else {
.rangeInfos = append(.rangeInfos, .fields[.Number()])
++
}
}
if len(.rangeInfos) > 1 && detrand.Bool() {
:= detrand.Intn(len(.rangeInfos) - 1)
.rangeInfos[], .rangeInfos[+1] = .rangeInfos[+1], .rangeInfos[]
}
}
func ( *MessageInfo) ( reflect.Type, structInfo) {
switch {
case .unknownOffset.IsValid() && .unknownType == unknownFieldsAType:
.getUnknown = func( pointer) protoreflect.RawFields {
if .IsNil() {
return nil
}
return *.Apply(.unknownOffset).Bytes()
}
.setUnknown = func( pointer, protoreflect.RawFields) {
if .IsNil() {
panic("invalid SetUnknown on nil Message")
}
*.Apply(.unknownOffset).Bytes() =
}
case .unknownOffset.IsValid() && .unknownType == unknownFieldsBType:
.getUnknown = func( pointer) protoreflect.RawFields {
if .IsNil() {
return nil
}
:= .Apply(.unknownOffset).BytesPtr()
if * == nil {
return nil
}
return **
}
.setUnknown = func( pointer, protoreflect.RawFields) {
if .IsNil() {
panic("invalid SetUnknown on nil Message")
}
:= .Apply(.unknownOffset).BytesPtr()
if * == nil {
* = new([]byte)
}
** =
}
default:
.getUnknown = func(pointer) protoreflect.RawFields {
return nil
}
.setUnknown = func( pointer, protoreflect.RawFields) {
if .IsNil() {
panic("invalid SetUnknown on nil Message")
}
}
}
}
func ( *MessageInfo) ( reflect.Type, structInfo) {
if .extensionOffset.IsValid() {
.extensionMap = func( pointer) *extensionMap {
if .IsNil() {
return (*extensionMap)(nil)
}
:= .Apply(.extensionOffset).AsValueOf(extensionFieldsType)
return (*extensionMap)(.Interface().(*map[int32]ExtensionField))
}
} else {
.extensionMap = func(pointer) *extensionMap {
return (*extensionMap)(nil)
}
}
}
func ( *MessageInfo) ( structInfo) {
:= .Desc
:= .Fields()
for := 0; < .Len(); ++ {
var reflect.Type
:= .Get()
:= .fieldsByNumber[.Number()]
:= .ContainingOneof() != nil && !.ContainingOneof().IsSynthetic()
if {
= .oneofsByName[.ContainingOneof().Name()]
}
var bool
switch {
case .Type == nil:
continue
case :
if .Enum() != nil || .Message() != nil {
= .oneofWrappersByNumber[.Number()].Field(0).Type
}
case .IsMap():
if .MapValue().Enum() != nil || .MapValue().Message() != nil {
= .Type.Elem()
}
= .MapValue().Message() != nil
case .IsList():
if .Enum() != nil || .Message() != nil {
= .Type.Elem()
}
= .Message() != nil
case .Enum() != nil:
= .Type
if .HasPresence() && .Kind() == reflect.Ptr {
= .Elem()
}
case .Message() != nil:
= .Type
if .IsWeak() {
= nil
}
= true
}
if && != nil && .Kind() != reflect.Ptr {
= reflect.PtrTo()
}
if != nil {
if .fieldTypes == nil {
.fieldTypes = make(map[protoreflect.FieldNumber]interface{})
}
.fieldTypes[.Number()] = reflect.Zero().Interface()
}
}
}
type extensionMap map[int32]ExtensionField
func ( *extensionMap) ( func(protoreflect.FieldDescriptor, protoreflect.Value) bool) {
if != nil {
for , := range * {
:= .Type().TypeDescriptor()
:= .Value()
if .IsList() && .List().Len() == 0 {
continue
}
if !(, ) {
return
}
}
}
}
func ( *extensionMap) ( protoreflect.ExtensionType) ( bool) {
if == nil {
return false
}
:= .TypeDescriptor()
, := (*)[int32(.Number())]
if ! {
return false
}
switch {
case .IsList():
return .Value().List().Len() > 0
case .IsMap():
return .Value().Map().Len() > 0
case .Message() != nil:
return .Value().Message().IsValid()
}
return true
}
func ( *extensionMap) ( protoreflect.ExtensionType) {
delete(*, int32(.TypeDescriptor().Number()))
}
func ( *extensionMap) ( protoreflect.ExtensionType) protoreflect.Value {
:= .TypeDescriptor()
if != nil {
if , := (*)[int32(.Number())]; {
return .Value()
}
}
return .Zero()
}
func ( *extensionMap) ( protoreflect.ExtensionType, protoreflect.Value) {
:= .TypeDescriptor()
:= true
switch {
case !.IsValidValue():
= false
case .IsList():
= .List().IsValid()
case .IsMap():
= .Map().IsValid()
case .Message() != nil:
= .Message().IsValid()
}
if ! {
panic(fmt.Sprintf("%v: assigning invalid value", .TypeDescriptor().FullName()))
}
if * == nil {
* = make(map[int32]ExtensionField)
}
var ExtensionField
.Set(, )
(*)[int32(.Number())] =
}
func ( *extensionMap) ( protoreflect.ExtensionType) protoreflect.Value {
:= .TypeDescriptor()
if .Kind() != protoreflect.MessageKind && .Kind() != protoreflect.GroupKind && !.IsList() && !.IsMap() {
panic("invalid Mutable on field with non-composite type")
}
if , := (*)[int32(.Number())]; {
return .Value()
}
:= .New()
.Set(, )
return
}
type MessageState struct {
pragma.NoUnkeyedLiterals
pragma.DoNotCompare
pragma.DoNotCopy
atomicMessageInfo *MessageInfo
}
type messageState MessageState
var (
_ protoreflect.Message = (*messageState)(nil)
_ unwrapper = (*messageState)(nil)
)
type messageDataType struct {
p pointer
mi *MessageInfo
}
type (
messageReflectWrapper messageDataType
messageIfaceWrapper messageDataType
)
var (
_ protoreflect.Message = (*messageReflectWrapper)(nil)
_ unwrapper = (*messageReflectWrapper)(nil)
_ protoreflect.ProtoMessage = (*messageIfaceWrapper)(nil)
_ unwrapper = (*messageIfaceWrapper)(nil)
)
func ( *MessageInfo) ( interface{}) protoreflect.Message {
if reflect.TypeOf() != .GoReflectType {
panic(fmt.Sprintf("type mismatch: got %T, want %v", , .GoReflectType))
}
:= pointerOfIface()
if .IsNil() {
return .nilMessage.Init()
}
return &messageReflectWrapper{, }
}
func ( *messageReflectWrapper) () pointer { return .p }
func ( *messageReflectWrapper) () *MessageInfo { return .mi }
func ( *messageIfaceWrapper) () {
if , := .protoUnwrap().(interface{ () }); {
.()
return
}
:= reflect.ValueOf(.protoUnwrap())
if .Kind() == reflect.Ptr && !.IsNil() {
.Elem().Set(reflect.Zero(.Type().Elem()))
}
}
func ( *messageIfaceWrapper) () protoreflect.Message {
return (*messageReflectWrapper)()
}
func ( *messageIfaceWrapper) () interface{} {
return .p.AsIfaceOf(.mi.GoReflectType.Elem())
}
func ( *MessageInfo) ( protoreflect.FieldDescriptor) (*fieldInfo, protoreflect.ExtensionType) {
var *fieldInfo
if := .Number(); 0 < && int() < len(.denseFields) {
= .denseFields[]
} else {
= .fields[]
}
if != nil {
if .fieldDesc != {
if , := .FullName(), .fieldDesc.FullName(); != {
panic(fmt.Sprintf("mismatching field: got %v, want %v", , ))
}
panic(fmt.Sprintf("mismatching field: %v", .FullName()))
}
return , nil
}
if .IsExtension() {
if , := .ContainingMessage().FullName(), .Desc.FullName(); != {
panic(fmt.Sprintf("extension %v has mismatching containing message: got %v, want %v", .FullName(), , ))
}
if !.Desc.ExtensionRanges().Has(.Number()) {
panic(fmt.Sprintf("extension %v extends %v outside the extension range", .FullName(), .Desc.FullName()))
}
, := .(protoreflect.ExtensionTypeDescriptor)
if ! {
panic(fmt.Sprintf("extension %v does not implement protoreflect.ExtensionTypeDescriptor", .FullName()))
}
return nil, .Type()
}
panic(fmt.Sprintf("field %v is invalid", .FullName()))
}