Source File
legacy_message.go
Belonging Package
google.golang.org/protobuf/internal/impl
if , := legacyMessageTypeCache.Load(); {
return .(*MessageInfo)
}
:= &MessageInfo{
Desc: legacyLoadMessageDesc(, ),
GoReflectType: ,
}
:= reflect.Zero().Interface()
if , := .(legacyMarshaler); {
.methods.Marshal = legacyMarshal
.methods.Flags |= piface.SupportMarshalDeterministic
}
if , := .(legacyUnmarshaler); {
.methods.Unmarshal = legacyUnmarshal
}
if , := .(legacyMerger); {
.methods.Merge = legacyMerge
}
if , := legacyMessageTypeCache.LoadOrStore(, ); {
return .(*MessageInfo)
}
return
}
var legacyMessageDescCache sync.Map // map[reflect.Type]protoreflect.MessageDescriptor
func ( reflect.Type) pref.MessageDescriptor {
return legacyLoadMessageDesc(, "")
}
if , := legacyMessageDescCache.Load(); {
return .(pref.MessageDescriptor)
}
:= reflect.Zero().Interface()
if , := .(pref.ProtoMessage); {
panic(fmt.Sprintf("%v already implements proto.Message", ))
}
, := .(messageV1)
if ! {
return aberrantLoadMessageDesc(, )
}
, := func() ([]byte, []int) {
defer func() {
recover()
}()
return .Descriptor()
}()
if == nil {
return aberrantLoadMessageDesc(, )
}
if := .Elem().NumField(); > 0 {
:= false
for := 0; < ; ++ {
:= .Elem().Field()
if .Tag.Get("protobuf") != "" || .Tag.Get("protobuf_oneof") != "" || strings.HasPrefix(.Name, "XXX_") {
= true
break
}
}
if ! {
return aberrantLoadMessageDesc(, )
}
}
:= legacyLoadFileDesc().Messages().Get([0])
for , := range [1:] {
= .Messages().Get()
}
if != "" && .FullName() != {
panic(fmt.Sprintf("mismatching message name: got %v, want %v", .FullName(), ))
}
if , := legacyMessageDescCache.LoadOrStore(, ); {
return .(protoreflect.MessageDescriptor)
}
return
}
var (
aberrantMessageDescLock sync.Mutex
aberrantMessageDescCache map[reflect.Type]protoreflect.MessageDescriptor
)
func ( reflect.Type, pref.FullName) pref.MessageDescriptor {
aberrantMessageDescLock.Lock()
defer aberrantMessageDescLock.Unlock()
if aberrantMessageDescCache == nil {
aberrantMessageDescCache = make(map[reflect.Type]protoreflect.MessageDescriptor)
}
return aberrantLoadMessageDescReentrant(, )
}
if , := aberrantMessageDescCache[]; {
return
}
for := 0; < .Elem().NumField(); ++ {
:= .Elem().Field()
if := .Tag.Get("protobuf"); != "" {
switch .Type.Kind() {
case reflect.Bool, reflect.Int32, reflect.Int64, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64, reflect.String:
.L0.ParentFile = filedesc.SurrogateProto3
}
for , := range strings.Split(, ",") {
if == "proto3" {
.L0.ParentFile = filedesc.SurrogateProto3
}
}
}
}
if , := .MethodByName("ExtensionRangeArray"); {
:= .Func.Call([]reflect.Value{reflect.Zero(.Type.In(0))})[0]
for := 0; < .Len(); ++ {
:= .Index()
.L2.ExtensionRanges.List = append(.L2.ExtensionRanges.List, [2]pref.FieldNumber{
pref.FieldNumber(.FieldByName("Start").Int()),
pref.FieldNumber(.FieldByName("End").Int() + 1),
})
.L2.ExtensionRangeOptions = append(.L2.ExtensionRangeOptions, nil)
}
}
for := 0; < .Elem().NumField(); ++ {
:= .Elem().Field()
if := .Tag.Get("protobuf"); != "" {
:= .Tag.Get("protobuf_key")
:= .Tag.Get("protobuf_val")
aberrantAppendField(, .Type, , , )
}
if := .Tag.Get("protobuf_oneof"); != "" {
:= len(.L2.Oneofs.List)
.L2.Oneofs.List = append(.L2.Oneofs.List, filedesc.Oneof{})
:= &.L2.Oneofs.List[]
.L0.FullName = .FullName().Append(pref.Name())
.L0.ParentFile = .L0.ParentFile
.L0.Parent =
.L0.Index =
for , := range {
if .Implements(.Type) {
:= .Elem().Field(0)
if := .Tag.Get("protobuf"); != "" {
aberrantAppendField(, .Type, , "", "")
:= &.L2.Fields.List[len(.L2.Fields.List)-1]
.L1.ContainingOneof =
.L1.Fields.List = append(.L1.Fields.List, )
}
}
}
}
}
return
}
func ( reflect.Type, pref.FullName) pref.FullName {
if .IsValid() {
return
}
func() {
defer func() { recover() }() // swallow possible nil panics
if , := reflect.Zero().Interface().(interface{ () string }); {
= pref.FullName(.())
}
}()
if .IsValid() {
return
}
if .Kind() == reflect.Ptr {
= .Elem()
}
return AberrantDeriveFullName()
}
func ( *filedesc.Message, reflect.Type, , , string) {
:=
:= .Kind() == reflect.Ptr && .Elem().Kind() != reflect.Struct
:= .Kind() == reflect.Slice && .Elem().Kind() != reflect.Uint8
if || {
= .Elem()
}
:= ptag.Unmarshal(, , placeholderEnumValues{}).(*filedesc.Field)
:= len(.L2.Fields.List)
.L2.Fields.List = append(.L2.Fields.List, *)
= &.L2.Fields.List[]
.L0.FullName = .FullName().Append(.Name())
.L0.ParentFile = .L0.ParentFile
.L0.Parent =
.L0.Index =
if .L1.IsWeak || .L1.HasPacked {
.L1.Options = func() pref.ProtoMessage {
:= descopts.Field.ProtoReflect().New()
if .L1.IsWeak {
.Set(.Descriptor().Fields().ByName("weak"), protoreflect.ValueOfBool(true))
}
if .L1.HasPacked {
.Set(.Descriptor().Fields().ByName("packed"), protoreflect.ValueOfBool(.L1.IsPacked))
}
return .Interface()
}
}
if .Enum() == nil && .Kind() == pref.EnumKind {
switch v := reflect.Zero().Interface().(type) {
case pref.Enum:
.L1.Enum = .Descriptor()
default:
.L1.Enum = LegacyLoadEnumDesc()
}
}
if .Message() == nil && (.Kind() == pref.MessageKind || .Kind() == pref.GroupKind) {
switch v := reflect.Zero().Interface().(type) {
case pref.ProtoMessage:
.L1.Message = .ProtoReflect().Descriptor()
case messageV1:
.L1.Message = LegacyLoadMessageDesc()
default:
if .Kind() == reflect.Map {
:= len(.L1.Messages.List)
.L1.Messages.List = append(.L1.Messages.List, filedesc.Message{L2: new(filedesc.MessageL2)})
:= &.L1.Messages.List[]
.L0.FullName = .FullName().Append(pref.Name(strs.MapEntryName(string(.Name()))))
.L0.ParentFile = .L0.ParentFile
.L0.Parent =
.L0.Index =
.L1.IsMapEntry = true
.L2.Options = func() pref.ProtoMessage {
:= descopts.Message.ProtoReflect().New()
.Set(.Descriptor().Fields().ByName("map_entry"), protoreflect.ValueOfBool(true))
return .Interface()
}
(, .Key(), , "", "")
(, .Elem(), , "", "")
.L1.Message =
break
}
.L1.Message = aberrantLoadMessageDescReentrant(, "")
}
}
}
type placeholderEnumValues struct {
protoreflect.EnumValueDescriptors
}
func (placeholderEnumValues) ( pref.EnumNumber) pref.EnumValueDescriptor {
return filedesc.PlaceholderEnumValue(pref.FullName(fmt.Sprintf("UNKNOWN_%d", )))
}
type legacyMarshaler interface {
Marshal() ([]byte, error)
}
type legacyUnmarshaler interface {
Unmarshal([]byte) error
}
type legacyMerger interface {
Merge(protoiface.MessageV1)
}
var legacyProtoMethods = &piface.Methods{
Marshal: legacyMarshal,
Unmarshal: legacyUnmarshal,
Merge: legacyMerge,
Flags: piface.SupportMarshalDeterministic,
}
func ( piface.MarshalInput) (piface.MarshalOutput, error) {
:= .Message.(unwrapper).protoUnwrap()
, := .(legacyMarshaler)
if ! {
return piface.MarshalOutput{}, errors.New("%T does not implement Marshal", )
}
, := .Marshal()
if .Buf != nil {
= append(.Buf, ...)
}
return piface.MarshalOutput{
Buf: ,
},
}
func ( piface.UnmarshalInput) (piface.UnmarshalOutput, error) {
:= .Message.(unwrapper).protoUnwrap()
, := .(legacyUnmarshaler)
if ! {
return piface.UnmarshalOutput{}, errors.New("%T does not implement Marshal", )
}
return piface.UnmarshalOutput{}, .Unmarshal(.Buf)
}
func ( piface.MergeInput) piface.MergeOutput {
:= .Destination.(unwrapper).protoUnwrap()
, := .(legacyMerger)
if ! {
return piface.MergeOutput{}
}
.Merge(Export{}.ProtoMessageV1Of(.Source))
return piface.MergeOutput{Flags: piface.MergeComplete}
}
type aberrantMessageType struct {
t reflect.Type
}
func ( aberrantMessageType) () pref.Message {
return aberrantMessage{reflect.Zero(.t)}
}
func ( aberrantMessageType) () pref.Message {
return aberrantMessage{reflect.Zero(.t)}
}
func ( aberrantMessageType) () reflect.Type {
return .t
}
func ( aberrantMessageType) () pref.MessageDescriptor {
return LegacyLoadMessageDesc(.t)
}
type aberrantMessage struct {
v reflect.Value
}
func ( aberrantMessage) () pref.Message {
return
}
func ( aberrantMessage) () pref.MessageDescriptor {
return LegacyLoadMessageDesc(.v.Type())
}
func ( aberrantMessage) () pref.MessageType {
return aberrantMessageType{.v.Type()}
}
func ( aberrantMessage) () pref.Message {
return aberrantMessage{reflect.Zero(.v.Type())}
}
func ( aberrantMessage) () pref.ProtoMessage {
return
}
func ( aberrantMessage) ( func(pref.FieldDescriptor, pref.Value) bool) {
}
func ( aberrantMessage) (pref.FieldDescriptor) bool {
panic("invalid field descriptor")
}
func ( aberrantMessage) (pref.FieldDescriptor) {
panic("invalid field descriptor")
}
func ( aberrantMessage) (pref.FieldDescriptor) pref.Value {
panic("invalid field descriptor")
}
func ( aberrantMessage) (pref.FieldDescriptor, pref.Value) {
panic("invalid field descriptor")
}
func ( aberrantMessage) (pref.FieldDescriptor) pref.Value {
panic("invalid field descriptor")
}
func ( aberrantMessage) (pref.FieldDescriptor) pref.Value {
panic("invalid field descriptor")
}
func ( aberrantMessage) (pref.OneofDescriptor) pref.FieldDescriptor {
panic("invalid oneof descriptor")
}
func ( aberrantMessage) () pref.RawFields {
return nil
}
}
return true
}
func ( aberrantMessage) () *piface.Methods {
return legacyProtoMethods
}
func ( aberrantMessage) () interface{} {
return .v.Interface()
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |