codec_field.go 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788
  1. // Copyright 2019 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package impl
  5. import (
  6. "reflect"
  7. "google.golang.org/protobuf/encoding/protowire"
  8. "google.golang.org/protobuf/internal/errors"
  9. "google.golang.org/protobuf/proto"
  10. "google.golang.org/protobuf/reflect/protoreflect"
  11. "google.golang.org/protobuf/runtime/protoiface"
  12. )
  13. type errInvalidUTF8 struct{}
  14. func (errInvalidUTF8) Error() string { return "string field contains invalid UTF-8" }
  15. func (errInvalidUTF8) InvalidUTF8() bool { return true }
  16. func (errInvalidUTF8) Unwrap() error { return errors.Error }
  17. // initOneofFieldCoders initializes the fast-path functions for the fields in a oneof.
  18. //
  19. // For size, marshal, and isInit operations, functions are set only on the first field
  20. // in the oneof. The functions are called when the oneof is non-nil, and will dispatch
  21. // to the appropriate field-specific function as necessary.
  22. //
  23. // The unmarshal function is set on each field individually as usual.
  24. func (mi *MessageInfo) initOneofFieldCoders(od protoreflect.OneofDescriptor, si structInfo) {
  25. fs := si.oneofsByName[od.Name()]
  26. ft := fs.Type
  27. oneofFields := make(map[reflect.Type]*coderFieldInfo)
  28. needIsInit := false
  29. fields := od.Fields()
  30. for i, lim := 0, fields.Len(); i < lim; i++ {
  31. fd := od.Fields().Get(i)
  32. num := fd.Number()
  33. // Make a copy of the original coderFieldInfo for use in unmarshaling.
  34. //
  35. // oneofFields[oneofType].funcs.marshal is the field-specific marshal function.
  36. //
  37. // mi.coderFields[num].marshal is set on only the first field in the oneof,
  38. // and dispatches to the field-specific marshaler in oneofFields.
  39. cf := *mi.coderFields[num]
  40. ot := si.oneofWrappersByNumber[num]
  41. cf.ft = ot.Field(0).Type
  42. cf.mi, cf.funcs = fieldCoder(fd, cf.ft)
  43. oneofFields[ot] = &cf
  44. if cf.funcs.isInit != nil {
  45. needIsInit = true
  46. }
  47. mi.coderFields[num].funcs.unmarshal = func(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) {
  48. var vw reflect.Value // pointer to wrapper type
  49. vi := p.AsValueOf(ft).Elem() // oneof field value of interface kind
  50. if !vi.IsNil() && !vi.Elem().IsNil() && vi.Elem().Elem().Type() == ot {
  51. vw = vi.Elem()
  52. } else {
  53. vw = reflect.New(ot)
  54. }
  55. out, err := cf.funcs.unmarshal(b, pointerOfValue(vw).Apply(zeroOffset), wtyp, &cf, opts)
  56. if err != nil {
  57. return out, err
  58. }
  59. if cf.funcs.isInit == nil {
  60. out.initialized = true
  61. }
  62. vi.Set(vw)
  63. return out, nil
  64. }
  65. }
  66. getInfo := func(p pointer) (pointer, *coderFieldInfo) {
  67. v := p.AsValueOf(ft).Elem()
  68. if v.IsNil() {
  69. return pointer{}, nil
  70. }
  71. v = v.Elem() // interface -> *struct
  72. if v.IsNil() {
  73. return pointer{}, nil
  74. }
  75. return pointerOfValue(v).Apply(zeroOffset), oneofFields[v.Elem().Type()]
  76. }
  77. first := mi.coderFields[od.Fields().Get(0).Number()]
  78. first.funcs.size = func(p pointer, _ *coderFieldInfo, opts marshalOptions) int {
  79. p, info := getInfo(p)
  80. if info == nil || info.funcs.size == nil {
  81. return 0
  82. }
  83. return info.funcs.size(p, info, opts)
  84. }
  85. first.funcs.marshal = func(b []byte, p pointer, _ *coderFieldInfo, opts marshalOptions) ([]byte, error) {
  86. p, info := getInfo(p)
  87. if info == nil || info.funcs.marshal == nil {
  88. return b, nil
  89. }
  90. return info.funcs.marshal(b, p, info, opts)
  91. }
  92. first.funcs.merge = func(dst, src pointer, _ *coderFieldInfo, opts mergeOptions) {
  93. srcp, srcinfo := getInfo(src)
  94. if srcinfo == nil || srcinfo.funcs.merge == nil {
  95. return
  96. }
  97. dstp, dstinfo := getInfo(dst)
  98. if dstinfo != srcinfo {
  99. dst.AsValueOf(ft).Elem().Set(reflect.New(src.AsValueOf(ft).Elem().Elem().Elem().Type()))
  100. dstp = pointerOfValue(dst.AsValueOf(ft).Elem().Elem()).Apply(zeroOffset)
  101. }
  102. srcinfo.funcs.merge(dstp, srcp, srcinfo, opts)
  103. }
  104. if needIsInit {
  105. first.funcs.isInit = func(p pointer, _ *coderFieldInfo) error {
  106. p, info := getInfo(p)
  107. if info == nil || info.funcs.isInit == nil {
  108. return nil
  109. }
  110. return info.funcs.isInit(p, info)
  111. }
  112. }
  113. }
  114. func makeMessageFieldCoder(fd protoreflect.FieldDescriptor, ft reflect.Type) pointerCoderFuncs {
  115. if mi := getMessageInfo(ft); mi != nil {
  116. funcs := pointerCoderFuncs{
  117. size: sizeMessageInfo,
  118. marshal: appendMessageInfo,
  119. unmarshal: consumeMessageInfo,
  120. merge: mergeMessage,
  121. }
  122. if needsInitCheck(mi.Desc) {
  123. funcs.isInit = isInitMessageInfo
  124. }
  125. return funcs
  126. } else {
  127. return pointerCoderFuncs{
  128. size: func(p pointer, f *coderFieldInfo, opts marshalOptions) int {
  129. m := asMessage(p.AsValueOf(ft).Elem())
  130. return sizeMessage(m, f.tagsize, opts)
  131. },
  132. marshal: func(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
  133. m := asMessage(p.AsValueOf(ft).Elem())
  134. return appendMessage(b, m, f.wiretag, opts)
  135. },
  136. unmarshal: func(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) {
  137. mp := p.AsValueOf(ft).Elem()
  138. if mp.IsNil() {
  139. mp.Set(reflect.New(ft.Elem()))
  140. }
  141. return consumeMessage(b, asMessage(mp), wtyp, opts)
  142. },
  143. isInit: func(p pointer, f *coderFieldInfo) error {
  144. m := asMessage(p.AsValueOf(ft).Elem())
  145. return proto.CheckInitialized(m)
  146. },
  147. merge: mergeMessage,
  148. }
  149. }
  150. }
  151. func sizeMessageInfo(p pointer, f *coderFieldInfo, opts marshalOptions) int {
  152. return protowire.SizeBytes(f.mi.sizePointer(p.Elem(), opts)) + f.tagsize
  153. }
  154. func appendMessageInfo(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
  155. calculatedSize := f.mi.sizePointer(p.Elem(), opts)
  156. b = protowire.AppendVarint(b, f.wiretag)
  157. b = protowire.AppendVarint(b, uint64(calculatedSize))
  158. before := len(b)
  159. b, err := f.mi.marshalAppendPointer(b, p.Elem(), opts)
  160. if measuredSize := len(b) - before; calculatedSize != measuredSize && err == nil {
  161. return nil, errors.MismatchedSizeCalculation(calculatedSize, measuredSize)
  162. }
  163. return b, err
  164. }
  165. func consumeMessageInfo(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
  166. if wtyp != protowire.BytesType {
  167. return out, errUnknown
  168. }
  169. v, n := protowire.ConsumeBytes(b)
  170. if n < 0 {
  171. return out, errDecode
  172. }
  173. if p.Elem().IsNil() {
  174. p.SetPointer(pointerOfValue(reflect.New(f.mi.GoReflectType.Elem())))
  175. }
  176. o, err := f.mi.unmarshalPointer(v, p.Elem(), 0, opts)
  177. if err != nil {
  178. return out, err
  179. }
  180. out.n = n
  181. out.initialized = o.initialized
  182. return out, nil
  183. }
  184. func isInitMessageInfo(p pointer, f *coderFieldInfo) error {
  185. return f.mi.checkInitializedPointer(p.Elem())
  186. }
  187. func sizeMessage(m proto.Message, tagsize int, opts marshalOptions) int {
  188. return protowire.SizeBytes(opts.Options().Size(m)) + tagsize
  189. }
  190. func appendMessage(b []byte, m proto.Message, wiretag uint64, opts marshalOptions) ([]byte, error) {
  191. mopts := opts.Options()
  192. calculatedSize := mopts.Size(m)
  193. b = protowire.AppendVarint(b, wiretag)
  194. b = protowire.AppendVarint(b, uint64(calculatedSize))
  195. before := len(b)
  196. b, err := mopts.MarshalAppend(b, m)
  197. if measuredSize := len(b) - before; calculatedSize != measuredSize && err == nil {
  198. return nil, errors.MismatchedSizeCalculation(calculatedSize, measuredSize)
  199. }
  200. return b, err
  201. }
  202. func consumeMessage(b []byte, m proto.Message, wtyp protowire.Type, opts unmarshalOptions) (out unmarshalOutput, err error) {
  203. if wtyp != protowire.BytesType {
  204. return out, errUnknown
  205. }
  206. v, n := protowire.ConsumeBytes(b)
  207. if n < 0 {
  208. return out, errDecode
  209. }
  210. o, err := opts.Options().UnmarshalState(protoiface.UnmarshalInput{
  211. Buf: v,
  212. Message: m.ProtoReflect(),
  213. })
  214. if err != nil {
  215. return out, err
  216. }
  217. out.n = n
  218. out.initialized = o.Flags&protoiface.UnmarshalInitialized != 0
  219. return out, nil
  220. }
  221. func sizeMessageValue(v protoreflect.Value, tagsize int, opts marshalOptions) int {
  222. m := v.Message().Interface()
  223. return sizeMessage(m, tagsize, opts)
  224. }
  225. func appendMessageValue(b []byte, v protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
  226. m := v.Message().Interface()
  227. return appendMessage(b, m, wiretag, opts)
  228. }
  229. func consumeMessageValue(b []byte, v protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (protoreflect.Value, unmarshalOutput, error) {
  230. m := v.Message().Interface()
  231. out, err := consumeMessage(b, m, wtyp, opts)
  232. return v, out, err
  233. }
  234. func isInitMessageValue(v protoreflect.Value) error {
  235. m := v.Message().Interface()
  236. return proto.CheckInitialized(m)
  237. }
  238. var coderMessageValue = valueCoderFuncs{
  239. size: sizeMessageValue,
  240. marshal: appendMessageValue,
  241. unmarshal: consumeMessageValue,
  242. isInit: isInitMessageValue,
  243. merge: mergeMessageValue,
  244. }
  245. func sizeGroupValue(v protoreflect.Value, tagsize int, opts marshalOptions) int {
  246. m := v.Message().Interface()
  247. return sizeGroup(m, tagsize, opts)
  248. }
  249. func appendGroupValue(b []byte, v protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
  250. m := v.Message().Interface()
  251. return appendGroup(b, m, wiretag, opts)
  252. }
  253. func consumeGroupValue(b []byte, v protoreflect.Value, num protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (protoreflect.Value, unmarshalOutput, error) {
  254. m := v.Message().Interface()
  255. out, err := consumeGroup(b, m, num, wtyp, opts)
  256. return v, out, err
  257. }
  258. var coderGroupValue = valueCoderFuncs{
  259. size: sizeGroupValue,
  260. marshal: appendGroupValue,
  261. unmarshal: consumeGroupValue,
  262. isInit: isInitMessageValue,
  263. merge: mergeMessageValue,
  264. }
  265. func makeGroupFieldCoder(fd protoreflect.FieldDescriptor, ft reflect.Type) pointerCoderFuncs {
  266. num := fd.Number()
  267. if mi := getMessageInfo(ft); mi != nil {
  268. funcs := pointerCoderFuncs{
  269. size: sizeGroupType,
  270. marshal: appendGroupType,
  271. unmarshal: consumeGroupType,
  272. merge: mergeMessage,
  273. }
  274. if needsInitCheck(mi.Desc) {
  275. funcs.isInit = isInitMessageInfo
  276. }
  277. return funcs
  278. } else {
  279. return pointerCoderFuncs{
  280. size: func(p pointer, f *coderFieldInfo, opts marshalOptions) int {
  281. m := asMessage(p.AsValueOf(ft).Elem())
  282. return sizeGroup(m, f.tagsize, opts)
  283. },
  284. marshal: func(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
  285. m := asMessage(p.AsValueOf(ft).Elem())
  286. return appendGroup(b, m, f.wiretag, opts)
  287. },
  288. unmarshal: func(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) {
  289. mp := p.AsValueOf(ft).Elem()
  290. if mp.IsNil() {
  291. mp.Set(reflect.New(ft.Elem()))
  292. }
  293. return consumeGroup(b, asMessage(mp), num, wtyp, opts)
  294. },
  295. isInit: func(p pointer, f *coderFieldInfo) error {
  296. m := asMessage(p.AsValueOf(ft).Elem())
  297. return proto.CheckInitialized(m)
  298. },
  299. merge: mergeMessage,
  300. }
  301. }
  302. }
  303. func sizeGroupType(p pointer, f *coderFieldInfo, opts marshalOptions) int {
  304. return 2*f.tagsize + f.mi.sizePointer(p.Elem(), opts)
  305. }
  306. func appendGroupType(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
  307. b = protowire.AppendVarint(b, f.wiretag) // start group
  308. b, err := f.mi.marshalAppendPointer(b, p.Elem(), opts)
  309. b = protowire.AppendVarint(b, f.wiretag+1) // end group
  310. return b, err
  311. }
  312. func consumeGroupType(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
  313. if wtyp != protowire.StartGroupType {
  314. return out, errUnknown
  315. }
  316. if p.Elem().IsNil() {
  317. p.SetPointer(pointerOfValue(reflect.New(f.mi.GoReflectType.Elem())))
  318. }
  319. return f.mi.unmarshalPointer(b, p.Elem(), f.num, opts)
  320. }
  321. func sizeGroup(m proto.Message, tagsize int, opts marshalOptions) int {
  322. return 2*tagsize + opts.Options().Size(m)
  323. }
  324. func appendGroup(b []byte, m proto.Message, wiretag uint64, opts marshalOptions) ([]byte, error) {
  325. b = protowire.AppendVarint(b, wiretag) // start group
  326. b, err := opts.Options().MarshalAppend(b, m)
  327. b = protowire.AppendVarint(b, wiretag+1) // end group
  328. return b, err
  329. }
  330. func consumeGroup(b []byte, m proto.Message, num protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (out unmarshalOutput, err error) {
  331. if wtyp != protowire.StartGroupType {
  332. return out, errUnknown
  333. }
  334. b, n := protowire.ConsumeGroup(num, b)
  335. if n < 0 {
  336. return out, errDecode
  337. }
  338. o, err := opts.Options().UnmarshalState(protoiface.UnmarshalInput{
  339. Buf: b,
  340. Message: m.ProtoReflect(),
  341. })
  342. if err != nil {
  343. return out, err
  344. }
  345. out.n = n
  346. out.initialized = o.Flags&protoiface.UnmarshalInitialized != 0
  347. return out, nil
  348. }
  349. func makeMessageSliceFieldCoder(fd protoreflect.FieldDescriptor, ft reflect.Type) pointerCoderFuncs {
  350. if mi := getMessageInfo(ft); mi != nil {
  351. funcs := pointerCoderFuncs{
  352. size: sizeMessageSliceInfo,
  353. marshal: appendMessageSliceInfo,
  354. unmarshal: consumeMessageSliceInfo,
  355. merge: mergeMessageSlice,
  356. }
  357. if needsInitCheck(mi.Desc) {
  358. funcs.isInit = isInitMessageSliceInfo
  359. }
  360. return funcs
  361. }
  362. return pointerCoderFuncs{
  363. size: func(p pointer, f *coderFieldInfo, opts marshalOptions) int {
  364. return sizeMessageSlice(p, ft, f.tagsize, opts)
  365. },
  366. marshal: func(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
  367. return appendMessageSlice(b, p, f.wiretag, ft, opts)
  368. },
  369. unmarshal: func(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) {
  370. return consumeMessageSlice(b, p, ft, wtyp, opts)
  371. },
  372. isInit: func(p pointer, f *coderFieldInfo) error {
  373. return isInitMessageSlice(p, ft)
  374. },
  375. merge: mergeMessageSlice,
  376. }
  377. }
  378. func sizeMessageSliceInfo(p pointer, f *coderFieldInfo, opts marshalOptions) int {
  379. s := p.PointerSlice()
  380. n := 0
  381. for _, v := range s {
  382. n += protowire.SizeBytes(f.mi.sizePointer(v, opts)) + f.tagsize
  383. }
  384. return n
  385. }
  386. func appendMessageSliceInfo(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
  387. s := p.PointerSlice()
  388. var err error
  389. for _, v := range s {
  390. b = protowire.AppendVarint(b, f.wiretag)
  391. siz := f.mi.sizePointer(v, opts)
  392. b = protowire.AppendVarint(b, uint64(siz))
  393. before := len(b)
  394. b, err = f.mi.marshalAppendPointer(b, v, opts)
  395. if err != nil {
  396. return b, err
  397. }
  398. if measuredSize := len(b) - before; siz != measuredSize {
  399. return nil, errors.MismatchedSizeCalculation(siz, measuredSize)
  400. }
  401. }
  402. return b, nil
  403. }
  404. func consumeMessageSliceInfo(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
  405. if wtyp != protowire.BytesType {
  406. return out, errUnknown
  407. }
  408. v, n := protowire.ConsumeBytes(b)
  409. if n < 0 {
  410. return out, errDecode
  411. }
  412. m := reflect.New(f.mi.GoReflectType.Elem()).Interface()
  413. mp := pointerOfIface(m)
  414. o, err := f.mi.unmarshalPointer(v, mp, 0, opts)
  415. if err != nil {
  416. return out, err
  417. }
  418. p.AppendPointerSlice(mp)
  419. out.n = n
  420. out.initialized = o.initialized
  421. return out, nil
  422. }
  423. func isInitMessageSliceInfo(p pointer, f *coderFieldInfo) error {
  424. s := p.PointerSlice()
  425. for _, v := range s {
  426. if err := f.mi.checkInitializedPointer(v); err != nil {
  427. return err
  428. }
  429. }
  430. return nil
  431. }
  432. func sizeMessageSlice(p pointer, goType reflect.Type, tagsize int, opts marshalOptions) int {
  433. mopts := opts.Options()
  434. s := p.PointerSlice()
  435. n := 0
  436. for _, v := range s {
  437. m := asMessage(v.AsValueOf(goType.Elem()))
  438. n += protowire.SizeBytes(mopts.Size(m)) + tagsize
  439. }
  440. return n
  441. }
  442. func appendMessageSlice(b []byte, p pointer, wiretag uint64, goType reflect.Type, opts marshalOptions) ([]byte, error) {
  443. mopts := opts.Options()
  444. s := p.PointerSlice()
  445. var err error
  446. for _, v := range s {
  447. m := asMessage(v.AsValueOf(goType.Elem()))
  448. b = protowire.AppendVarint(b, wiretag)
  449. siz := mopts.Size(m)
  450. b = protowire.AppendVarint(b, uint64(siz))
  451. before := len(b)
  452. b, err = mopts.MarshalAppend(b, m)
  453. if err != nil {
  454. return b, err
  455. }
  456. if measuredSize := len(b) - before; siz != measuredSize {
  457. return nil, errors.MismatchedSizeCalculation(siz, measuredSize)
  458. }
  459. }
  460. return b, nil
  461. }
  462. func consumeMessageSlice(b []byte, p pointer, goType reflect.Type, wtyp protowire.Type, opts unmarshalOptions) (out unmarshalOutput, err error) {
  463. if wtyp != protowire.BytesType {
  464. return out, errUnknown
  465. }
  466. v, n := protowire.ConsumeBytes(b)
  467. if n < 0 {
  468. return out, errDecode
  469. }
  470. mp := reflect.New(goType.Elem())
  471. o, err := opts.Options().UnmarshalState(protoiface.UnmarshalInput{
  472. Buf: v,
  473. Message: asMessage(mp).ProtoReflect(),
  474. })
  475. if err != nil {
  476. return out, err
  477. }
  478. p.AppendPointerSlice(pointerOfValue(mp))
  479. out.n = n
  480. out.initialized = o.Flags&protoiface.UnmarshalInitialized != 0
  481. return out, nil
  482. }
  483. func isInitMessageSlice(p pointer, goType reflect.Type) error {
  484. s := p.PointerSlice()
  485. for _, v := range s {
  486. m := asMessage(v.AsValueOf(goType.Elem()))
  487. if err := proto.CheckInitialized(m); err != nil {
  488. return err
  489. }
  490. }
  491. return nil
  492. }
  493. // Slices of messages
  494. func sizeMessageSliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) int {
  495. mopts := opts.Options()
  496. list := listv.List()
  497. n := 0
  498. for i, llen := 0, list.Len(); i < llen; i++ {
  499. m := list.Get(i).Message().Interface()
  500. n += protowire.SizeBytes(mopts.Size(m)) + tagsize
  501. }
  502. return n
  503. }
  504. func appendMessageSliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
  505. list := listv.List()
  506. mopts := opts.Options()
  507. for i, llen := 0, list.Len(); i < llen; i++ {
  508. m := list.Get(i).Message().Interface()
  509. b = protowire.AppendVarint(b, wiretag)
  510. siz := mopts.Size(m)
  511. b = protowire.AppendVarint(b, uint64(siz))
  512. before := len(b)
  513. var err error
  514. b, err = mopts.MarshalAppend(b, m)
  515. if err != nil {
  516. return b, err
  517. }
  518. if measuredSize := len(b) - before; siz != measuredSize {
  519. return nil, errors.MismatchedSizeCalculation(siz, measuredSize)
  520. }
  521. }
  522. return b, nil
  523. }
  524. func consumeMessageSliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
  525. list := listv.List()
  526. if wtyp != protowire.BytesType {
  527. return protoreflect.Value{}, out, errUnknown
  528. }
  529. v, n := protowire.ConsumeBytes(b)
  530. if n < 0 {
  531. return protoreflect.Value{}, out, errDecode
  532. }
  533. m := list.NewElement()
  534. o, err := opts.Options().UnmarshalState(protoiface.UnmarshalInput{
  535. Buf: v,
  536. Message: m.Message(),
  537. })
  538. if err != nil {
  539. return protoreflect.Value{}, out, err
  540. }
  541. list.Append(m)
  542. out.n = n
  543. out.initialized = o.Flags&protoiface.UnmarshalInitialized != 0
  544. return listv, out, nil
  545. }
  546. func isInitMessageSliceValue(listv protoreflect.Value) error {
  547. list := listv.List()
  548. for i, llen := 0, list.Len(); i < llen; i++ {
  549. m := list.Get(i).Message().Interface()
  550. if err := proto.CheckInitialized(m); err != nil {
  551. return err
  552. }
  553. }
  554. return nil
  555. }
  556. var coderMessageSliceValue = valueCoderFuncs{
  557. size: sizeMessageSliceValue,
  558. marshal: appendMessageSliceValue,
  559. unmarshal: consumeMessageSliceValue,
  560. isInit: isInitMessageSliceValue,
  561. merge: mergeMessageListValue,
  562. }
  563. func sizeGroupSliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) int {
  564. mopts := opts.Options()
  565. list := listv.List()
  566. n := 0
  567. for i, llen := 0, list.Len(); i < llen; i++ {
  568. m := list.Get(i).Message().Interface()
  569. n += 2*tagsize + mopts.Size(m)
  570. }
  571. return n
  572. }
  573. func appendGroupSliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
  574. list := listv.List()
  575. mopts := opts.Options()
  576. for i, llen := 0, list.Len(); i < llen; i++ {
  577. m := list.Get(i).Message().Interface()
  578. b = protowire.AppendVarint(b, wiretag) // start group
  579. var err error
  580. b, err = mopts.MarshalAppend(b, m)
  581. if err != nil {
  582. return b, err
  583. }
  584. b = protowire.AppendVarint(b, wiretag+1) // end group
  585. }
  586. return b, nil
  587. }
  588. func consumeGroupSliceValue(b []byte, listv protoreflect.Value, num protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
  589. list := listv.List()
  590. if wtyp != protowire.StartGroupType {
  591. return protoreflect.Value{}, out, errUnknown
  592. }
  593. b, n := protowire.ConsumeGroup(num, b)
  594. if n < 0 {
  595. return protoreflect.Value{}, out, errDecode
  596. }
  597. m := list.NewElement()
  598. o, err := opts.Options().UnmarshalState(protoiface.UnmarshalInput{
  599. Buf: b,
  600. Message: m.Message(),
  601. })
  602. if err != nil {
  603. return protoreflect.Value{}, out, err
  604. }
  605. list.Append(m)
  606. out.n = n
  607. out.initialized = o.Flags&protoiface.UnmarshalInitialized != 0
  608. return listv, out, nil
  609. }
  610. var coderGroupSliceValue = valueCoderFuncs{
  611. size: sizeGroupSliceValue,
  612. marshal: appendGroupSliceValue,
  613. unmarshal: consumeGroupSliceValue,
  614. isInit: isInitMessageSliceValue,
  615. merge: mergeMessageListValue,
  616. }
  617. func makeGroupSliceFieldCoder(fd protoreflect.FieldDescriptor, ft reflect.Type) pointerCoderFuncs {
  618. num := fd.Number()
  619. if mi := getMessageInfo(ft); mi != nil {
  620. funcs := pointerCoderFuncs{
  621. size: sizeGroupSliceInfo,
  622. marshal: appendGroupSliceInfo,
  623. unmarshal: consumeGroupSliceInfo,
  624. merge: mergeMessageSlice,
  625. }
  626. if needsInitCheck(mi.Desc) {
  627. funcs.isInit = isInitMessageSliceInfo
  628. }
  629. return funcs
  630. }
  631. return pointerCoderFuncs{
  632. size: func(p pointer, f *coderFieldInfo, opts marshalOptions) int {
  633. return sizeGroupSlice(p, ft, f.tagsize, opts)
  634. },
  635. marshal: func(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
  636. return appendGroupSlice(b, p, f.wiretag, ft, opts)
  637. },
  638. unmarshal: func(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) {
  639. return consumeGroupSlice(b, p, num, wtyp, ft, opts)
  640. },
  641. isInit: func(p pointer, f *coderFieldInfo) error {
  642. return isInitMessageSlice(p, ft)
  643. },
  644. merge: mergeMessageSlice,
  645. }
  646. }
  647. func sizeGroupSlice(p pointer, messageType reflect.Type, tagsize int, opts marshalOptions) int {
  648. mopts := opts.Options()
  649. s := p.PointerSlice()
  650. n := 0
  651. for _, v := range s {
  652. m := asMessage(v.AsValueOf(messageType.Elem()))
  653. n += 2*tagsize + mopts.Size(m)
  654. }
  655. return n
  656. }
  657. func appendGroupSlice(b []byte, p pointer, wiretag uint64, messageType reflect.Type, opts marshalOptions) ([]byte, error) {
  658. s := p.PointerSlice()
  659. var err error
  660. for _, v := range s {
  661. m := asMessage(v.AsValueOf(messageType.Elem()))
  662. b = protowire.AppendVarint(b, wiretag) // start group
  663. b, err = opts.Options().MarshalAppend(b, m)
  664. if err != nil {
  665. return b, err
  666. }
  667. b = protowire.AppendVarint(b, wiretag+1) // end group
  668. }
  669. return b, nil
  670. }
  671. func consumeGroupSlice(b []byte, p pointer, num protowire.Number, wtyp protowire.Type, goType reflect.Type, opts unmarshalOptions) (out unmarshalOutput, err error) {
  672. if wtyp != protowire.StartGroupType {
  673. return out, errUnknown
  674. }
  675. b, n := protowire.ConsumeGroup(num, b)
  676. if n < 0 {
  677. return out, errDecode
  678. }
  679. mp := reflect.New(goType.Elem())
  680. o, err := opts.Options().UnmarshalState(protoiface.UnmarshalInput{
  681. Buf: b,
  682. Message: asMessage(mp).ProtoReflect(),
  683. })
  684. if err != nil {
  685. return out, err
  686. }
  687. p.AppendPointerSlice(pointerOfValue(mp))
  688. out.n = n
  689. out.initialized = o.Flags&protoiface.UnmarshalInitialized != 0
  690. return out, nil
  691. }
  692. func sizeGroupSliceInfo(p pointer, f *coderFieldInfo, opts marshalOptions) int {
  693. s := p.PointerSlice()
  694. n := 0
  695. for _, v := range s {
  696. n += 2*f.tagsize + f.mi.sizePointer(v, opts)
  697. }
  698. return n
  699. }
  700. func appendGroupSliceInfo(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
  701. s := p.PointerSlice()
  702. var err error
  703. for _, v := range s {
  704. b = protowire.AppendVarint(b, f.wiretag) // start group
  705. b, err = f.mi.marshalAppendPointer(b, v, opts)
  706. if err != nil {
  707. return b, err
  708. }
  709. b = protowire.AppendVarint(b, f.wiretag+1) // end group
  710. }
  711. return b, nil
  712. }
  713. func consumeGroupSliceInfo(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) {
  714. if wtyp != protowire.StartGroupType {
  715. return unmarshalOutput{}, errUnknown
  716. }
  717. m := reflect.New(f.mi.GoReflectType.Elem()).Interface()
  718. mp := pointerOfIface(m)
  719. out, err := f.mi.unmarshalPointer(b, mp, f.num, opts)
  720. if err != nil {
  721. return out, err
  722. }
  723. p.AppendPointerSlice(mp)
  724. return out, nil
  725. }
  726. func asMessage(v reflect.Value) protoreflect.ProtoMessage {
  727. if m, ok := v.Interface().(protoreflect.ProtoMessage); ok {
  728. return m
  729. }
  730. return legacyWrapMessage(v).Interface()
  731. }