codec_field.go 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754
  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/internal/encoding/wire"
  8. "google.golang.org/protobuf/proto"
  9. pref "google.golang.org/protobuf/reflect/protoreflect"
  10. )
  11. type errInvalidUTF8 struct{}
  12. func (errInvalidUTF8) Error() string { return "string field contains invalid UTF-8" }
  13. func (errInvalidUTF8) InvalidUTF8() bool { return true }
  14. func makeOneofFieldCoder(si structInfo, fd pref.FieldDescriptor) pointerCoderFuncs {
  15. ot := si.oneofWrappersByNumber[fd.Number()]
  16. funcs := fieldCoder(fd, ot.Field(0).Type)
  17. fs := si.oneofsByName[fd.ContainingOneof().Name()]
  18. ft := fs.Type
  19. wiretag := wire.EncodeTag(fd.Number(), wireTypes[fd.Kind()])
  20. tagsize := wire.SizeVarint(wiretag)
  21. getInfo := func(p pointer) (pointer, bool) {
  22. v := p.AsValueOf(ft).Elem()
  23. if v.IsNil() {
  24. return pointer{}, false
  25. }
  26. v = v.Elem() // interface -> *struct
  27. if v.Elem().Type() != ot {
  28. return pointer{}, false
  29. }
  30. return pointerOfValue(v).Apply(zeroOffset), true
  31. }
  32. pcf := pointerCoderFuncs{
  33. size: func(p pointer, _ int, opts marshalOptions) int {
  34. v, ok := getInfo(p)
  35. if !ok {
  36. return 0
  37. }
  38. return funcs.size(v, tagsize, opts)
  39. },
  40. marshal: func(b []byte, p pointer, wiretag uint64, opts marshalOptions) ([]byte, error) {
  41. v, ok := getInfo(p)
  42. if !ok {
  43. return b, nil
  44. }
  45. return funcs.marshal(b, v, wiretag, opts)
  46. },
  47. unmarshal: func(b []byte, p pointer, wtyp wire.Type, opts unmarshalOptions) (int, 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. n, err := funcs.unmarshal(b, pointerOfValue(vw).Apply(zeroOffset), wtyp, opts)
  56. if err != nil {
  57. return 0, err
  58. }
  59. vi.Set(vw)
  60. return n, nil
  61. },
  62. }
  63. if funcs.isInit != nil {
  64. pcf.isInit = func(p pointer) error {
  65. v, ok := getInfo(p)
  66. if !ok {
  67. return nil
  68. }
  69. return funcs.isInit(v)
  70. }
  71. }
  72. return pcf
  73. }
  74. func makeMessageFieldCoder(fd pref.FieldDescriptor, ft reflect.Type) pointerCoderFuncs {
  75. if mi := getMessageInfo(ft); mi != nil {
  76. return pointerCoderFuncs{
  77. size: func(p pointer, tagsize int, opts marshalOptions) int {
  78. return sizeMessageInfo(p, mi, tagsize, opts)
  79. },
  80. marshal: func(b []byte, p pointer, wiretag uint64, opts marshalOptions) ([]byte, error) {
  81. return appendMessageInfo(b, p, wiretag, mi, opts)
  82. },
  83. unmarshal: func(b []byte, p pointer, wtyp wire.Type, opts unmarshalOptions) (int, error) {
  84. return consumeMessageInfo(b, p, mi, wtyp, opts)
  85. },
  86. isInit: func(p pointer) error {
  87. return mi.isInitializedPointer(p.Elem())
  88. },
  89. }
  90. } else {
  91. return pointerCoderFuncs{
  92. size: func(p pointer, tagsize int, opts marshalOptions) int {
  93. m := asMessage(p.AsValueOf(ft).Elem())
  94. return sizeMessage(m, tagsize, opts)
  95. },
  96. marshal: func(b []byte, p pointer, wiretag uint64, opts marshalOptions) ([]byte, error) {
  97. m := asMessage(p.AsValueOf(ft).Elem())
  98. return appendMessage(b, m, wiretag, opts)
  99. },
  100. unmarshal: func(b []byte, p pointer, wtyp wire.Type, opts unmarshalOptions) (int, error) {
  101. mp := p.AsValueOf(ft).Elem()
  102. if mp.IsNil() {
  103. mp.Set(reflect.New(ft.Elem()))
  104. }
  105. return consumeMessage(b, asMessage(mp), wtyp, opts)
  106. },
  107. isInit: func(p pointer) error {
  108. m := asMessage(p.AsValueOf(ft).Elem())
  109. return proto.IsInitialized(m)
  110. },
  111. }
  112. }
  113. }
  114. func sizeMessageInfo(p pointer, mi *MessageInfo, tagsize int, opts marshalOptions) int {
  115. return wire.SizeBytes(mi.sizePointer(p.Elem(), opts)) + tagsize
  116. }
  117. func appendMessageInfo(b []byte, p pointer, wiretag uint64, mi *MessageInfo, opts marshalOptions) ([]byte, error) {
  118. b = wire.AppendVarint(b, wiretag)
  119. b = wire.AppendVarint(b, uint64(mi.sizePointer(p.Elem(), opts)))
  120. return mi.marshalAppendPointer(b, p.Elem(), opts)
  121. }
  122. func consumeMessageInfo(b []byte, p pointer, mi *MessageInfo, wtyp wire.Type, opts unmarshalOptions) (int, error) {
  123. if wtyp != wire.BytesType {
  124. return 0, errUnknown
  125. }
  126. v, n := wire.ConsumeBytes(b)
  127. if n < 0 {
  128. return 0, wire.ParseError(n)
  129. }
  130. if p.Elem().IsNil() {
  131. p.SetPointer(pointerOfValue(reflect.New(mi.GoType.Elem())))
  132. }
  133. if _, err := mi.unmarshalPointer(v, p.Elem(), 0, opts); err != nil {
  134. return 0, err
  135. }
  136. return n, nil
  137. }
  138. func sizeMessage(m proto.Message, tagsize int, _ marshalOptions) int {
  139. return wire.SizeBytes(proto.Size(m)) + tagsize
  140. }
  141. func appendMessage(b []byte, m proto.Message, wiretag uint64, opts marshalOptions) ([]byte, error) {
  142. b = wire.AppendVarint(b, wiretag)
  143. b = wire.AppendVarint(b, uint64(proto.Size(m)))
  144. return opts.Options().MarshalAppend(b, m)
  145. }
  146. func consumeMessage(b []byte, m proto.Message, wtyp wire.Type, opts unmarshalOptions) (int, error) {
  147. if wtyp != wire.BytesType {
  148. return 0, errUnknown
  149. }
  150. v, n := wire.ConsumeBytes(b)
  151. if n < 0 {
  152. return 0, wire.ParseError(n)
  153. }
  154. if err := opts.Options().Unmarshal(v, m); err != nil {
  155. return 0, err
  156. }
  157. return n, nil
  158. }
  159. func sizeMessageIface(ival interface{}, tagsize int, opts marshalOptions) int {
  160. m := Export{}.MessageOf(ival).Interface()
  161. return sizeMessage(m, tagsize, opts)
  162. }
  163. func appendMessageIface(b []byte, ival interface{}, wiretag uint64, opts marshalOptions) ([]byte, error) {
  164. m := Export{}.MessageOf(ival).Interface()
  165. return appendMessage(b, m, wiretag, opts)
  166. }
  167. func consumeMessageIface(b []byte, ival interface{}, _ wire.Number, wtyp wire.Type, opts unmarshalOptions) (interface{}, int, error) {
  168. m := Export{}.MessageOf(ival).Interface()
  169. n, err := consumeMessage(b, m, wtyp, opts)
  170. return ival, n, err
  171. }
  172. func isInitMessageIface(ival interface{}) error {
  173. m := Export{}.MessageOf(ival).Interface()
  174. return proto.IsInitialized(m)
  175. }
  176. var coderMessageIface = ifaceCoderFuncs{
  177. size: sizeMessageIface,
  178. marshal: appendMessageIface,
  179. unmarshal: consumeMessageIface,
  180. isInit: isInitMessageIface,
  181. }
  182. func makeGroupFieldCoder(fd pref.FieldDescriptor, ft reflect.Type) pointerCoderFuncs {
  183. num := fd.Number()
  184. if mi := getMessageInfo(ft); mi != nil {
  185. return pointerCoderFuncs{
  186. size: func(p pointer, tagsize int, opts marshalOptions) int {
  187. return sizeGroupType(p, mi, tagsize, opts)
  188. },
  189. marshal: func(b []byte, p pointer, wiretag uint64, opts marshalOptions) ([]byte, error) {
  190. return appendGroupType(b, p, wiretag, mi, opts)
  191. },
  192. unmarshal: func(b []byte, p pointer, wtyp wire.Type, opts unmarshalOptions) (int, error) {
  193. return consumeGroupType(b, p, mi, num, wtyp, opts)
  194. },
  195. isInit: func(p pointer) error {
  196. return mi.isInitializedPointer(p.Elem())
  197. },
  198. }
  199. } else {
  200. return pointerCoderFuncs{
  201. size: func(p pointer, tagsize int, opts marshalOptions) int {
  202. m := asMessage(p.AsValueOf(ft).Elem())
  203. return sizeGroup(m, tagsize, opts)
  204. },
  205. marshal: func(b []byte, p pointer, wiretag uint64, opts marshalOptions) ([]byte, error) {
  206. m := asMessage(p.AsValueOf(ft).Elem())
  207. return appendGroup(b, m, wiretag, opts)
  208. },
  209. unmarshal: func(b []byte, p pointer, wtyp wire.Type, opts unmarshalOptions) (int, error) {
  210. mp := p.AsValueOf(ft).Elem()
  211. if mp.IsNil() {
  212. mp.Set(reflect.New(ft.Elem()))
  213. }
  214. return consumeGroup(b, asMessage(mp), num, wtyp, opts)
  215. },
  216. isInit: func(p pointer) error {
  217. m := asMessage(p.AsValueOf(ft).Elem())
  218. return proto.IsInitialized(m)
  219. },
  220. }
  221. }
  222. }
  223. func sizeGroupType(p pointer, mi *MessageInfo, tagsize int, opts marshalOptions) int {
  224. return 2*tagsize + mi.sizePointer(p.Elem(), opts)
  225. }
  226. func appendGroupType(b []byte, p pointer, wiretag uint64, mi *MessageInfo, opts marshalOptions) ([]byte, error) {
  227. b = wire.AppendVarint(b, wiretag) // start group
  228. b, err := mi.marshalAppendPointer(b, p.Elem(), opts)
  229. b = wire.AppendVarint(b, wiretag+1) // end group
  230. return b, err
  231. }
  232. func consumeGroupType(b []byte, p pointer, mi *MessageInfo, num wire.Number, wtyp wire.Type, opts unmarshalOptions) (int, error) {
  233. if wtyp != wire.StartGroupType {
  234. return 0, errUnknown
  235. }
  236. if p.Elem().IsNil() {
  237. p.SetPointer(pointerOfValue(reflect.New(mi.GoType.Elem())))
  238. }
  239. return mi.unmarshalPointer(b, p.Elem(), num, opts)
  240. }
  241. func sizeGroup(m proto.Message, tagsize int, _ marshalOptions) int {
  242. return 2*tagsize + proto.Size(m)
  243. }
  244. func appendGroup(b []byte, m proto.Message, wiretag uint64, opts marshalOptions) ([]byte, error) {
  245. b = wire.AppendVarint(b, wiretag) // start group
  246. b, err := opts.Options().MarshalAppend(b, m)
  247. b = wire.AppendVarint(b, wiretag+1) // end group
  248. return b, err
  249. }
  250. func consumeGroup(b []byte, m proto.Message, num wire.Number, wtyp wire.Type, opts unmarshalOptions) (int, error) {
  251. if wtyp != wire.StartGroupType {
  252. return 0, errUnknown
  253. }
  254. b, n := wire.ConsumeGroup(num, b)
  255. if n < 0 {
  256. return 0, wire.ParseError(n)
  257. }
  258. return n, opts.Options().Unmarshal(b, m)
  259. }
  260. func makeGroupValueCoder(fd pref.FieldDescriptor, ft reflect.Type) ifaceCoderFuncs {
  261. return ifaceCoderFuncs{
  262. size: func(ival interface{}, tagsize int, opts marshalOptions) int {
  263. m := Export{}.MessageOf(ival).Interface()
  264. return sizeGroup(m, tagsize, opts)
  265. },
  266. marshal: func(b []byte, ival interface{}, wiretag uint64, opts marshalOptions) ([]byte, error) {
  267. m := Export{}.MessageOf(ival).Interface()
  268. return appendGroup(b, m, wiretag, opts)
  269. },
  270. unmarshal: func(b []byte, ival interface{}, num wire.Number, wtyp wire.Type, opts unmarshalOptions) (interface{}, int, error) {
  271. m := Export{}.MessageOf(ival).Interface()
  272. n, err := consumeGroup(b, m, num, wtyp, opts)
  273. return ival, n, err
  274. },
  275. isInit: isInitMessageIface,
  276. }
  277. }
  278. func makeMessageSliceFieldCoder(fd pref.FieldDescriptor, ft reflect.Type) pointerCoderFuncs {
  279. if mi := getMessageInfo(ft); mi != nil {
  280. return pointerCoderFuncs{
  281. size: func(p pointer, tagsize int, opts marshalOptions) int {
  282. return sizeMessageSliceInfo(p, mi, tagsize, opts)
  283. },
  284. marshal: func(b []byte, p pointer, wiretag uint64, opts marshalOptions) ([]byte, error) {
  285. return appendMessageSliceInfo(b, p, wiretag, mi, opts)
  286. },
  287. unmarshal: func(b []byte, p pointer, wtyp wire.Type, opts unmarshalOptions) (int, error) {
  288. return consumeMessageSliceInfo(b, p, mi, wtyp, opts)
  289. },
  290. isInit: func(p pointer) error {
  291. return isInitMessageSliceInfo(p, mi)
  292. },
  293. }
  294. }
  295. return pointerCoderFuncs{
  296. size: func(p pointer, tagsize int, opts marshalOptions) int {
  297. return sizeMessageSlice(p, ft, tagsize, opts)
  298. },
  299. marshal: func(b []byte, p pointer, wiretag uint64, opts marshalOptions) ([]byte, error) {
  300. return appendMessageSlice(b, p, wiretag, ft, opts)
  301. },
  302. unmarshal: func(b []byte, p pointer, wtyp wire.Type, opts unmarshalOptions) (int, error) {
  303. return consumeMessageSlice(b, p, ft, wtyp, opts)
  304. },
  305. isInit: func(p pointer) error {
  306. return isInitMessageSlice(p, ft)
  307. },
  308. }
  309. }
  310. func sizeMessageSliceInfo(p pointer, mi *MessageInfo, tagsize int, opts marshalOptions) int {
  311. s := p.PointerSlice()
  312. n := 0
  313. for _, v := range s {
  314. n += wire.SizeBytes(mi.sizePointer(v, opts)) + tagsize
  315. }
  316. return n
  317. }
  318. func appendMessageSliceInfo(b []byte, p pointer, wiretag uint64, mi *MessageInfo, opts marshalOptions) ([]byte, error) {
  319. s := p.PointerSlice()
  320. var err error
  321. for _, v := range s {
  322. b = wire.AppendVarint(b, wiretag)
  323. siz := mi.sizePointer(v, opts)
  324. b = wire.AppendVarint(b, uint64(siz))
  325. b, err = mi.marshalAppendPointer(b, v, opts)
  326. if err != nil {
  327. return b, err
  328. }
  329. }
  330. return b, nil
  331. }
  332. func consumeMessageSliceInfo(b []byte, p pointer, mi *MessageInfo, wtyp wire.Type, opts unmarshalOptions) (int, error) {
  333. if wtyp != wire.BytesType {
  334. return 0, errUnknown
  335. }
  336. v, n := wire.ConsumeBytes(b)
  337. if n < 0 {
  338. return 0, wire.ParseError(n)
  339. }
  340. m := reflect.New(mi.GoType.Elem()).Interface()
  341. mp := pointerOfIface(m)
  342. if _, err := mi.unmarshalPointer(v, mp, 0, opts); err != nil {
  343. return 0, err
  344. }
  345. p.AppendPointerSlice(mp)
  346. return n, nil
  347. }
  348. func isInitMessageSliceInfo(p pointer, mi *MessageInfo) error {
  349. s := p.PointerSlice()
  350. for _, v := range s {
  351. if err := mi.isInitializedPointer(v); err != nil {
  352. return err
  353. }
  354. }
  355. return nil
  356. }
  357. func sizeMessageSlice(p pointer, goType reflect.Type, tagsize int, _ marshalOptions) int {
  358. s := p.PointerSlice()
  359. n := 0
  360. for _, v := range s {
  361. m := asMessage(v.AsValueOf(goType.Elem()))
  362. n += wire.SizeBytes(proto.Size(m)) + tagsize
  363. }
  364. return n
  365. }
  366. func appendMessageSlice(b []byte, p pointer, wiretag uint64, goType reflect.Type, opts marshalOptions) ([]byte, error) {
  367. s := p.PointerSlice()
  368. var err error
  369. for _, v := range s {
  370. m := asMessage(v.AsValueOf(goType.Elem()))
  371. b = wire.AppendVarint(b, wiretag)
  372. siz := proto.Size(m)
  373. b = wire.AppendVarint(b, uint64(siz))
  374. b, err = opts.Options().MarshalAppend(b, m)
  375. if err != nil {
  376. return b, err
  377. }
  378. }
  379. return b, nil
  380. }
  381. func consumeMessageSlice(b []byte, p pointer, goType reflect.Type, wtyp wire.Type, opts unmarshalOptions) (int, error) {
  382. if wtyp != wire.BytesType {
  383. return 0, errUnknown
  384. }
  385. v, n := wire.ConsumeBytes(b)
  386. if n < 0 {
  387. return 0, wire.ParseError(n)
  388. }
  389. mp := reflect.New(goType.Elem())
  390. if err := opts.Options().Unmarshal(v, asMessage(mp)); err != nil {
  391. return 0, err
  392. }
  393. p.AppendPointerSlice(pointerOfValue(mp))
  394. return n, nil
  395. }
  396. func isInitMessageSlice(p pointer, goType reflect.Type) error {
  397. s := p.PointerSlice()
  398. for _, v := range s {
  399. m := asMessage(v.AsValueOf(goType.Elem()))
  400. if err := proto.IsInitialized(m); err != nil {
  401. return err
  402. }
  403. }
  404. return nil
  405. }
  406. // Slices of messages
  407. func sizeMessageSliceIface(ival interface{}, tagsize int, opts marshalOptions) int {
  408. p := pointerOfIface(ival)
  409. return sizeMessageSlice(p, reflect.TypeOf(ival).Elem().Elem(), tagsize, opts)
  410. }
  411. func appendMessageSliceIface(b []byte, ival interface{}, wiretag uint64, opts marshalOptions) ([]byte, error) {
  412. p := pointerOfIface(ival)
  413. return appendMessageSlice(b, p, wiretag, reflect.TypeOf(ival).Elem().Elem(), opts)
  414. }
  415. func consumeMessageSliceIface(b []byte, ival interface{}, _ wire.Number, wtyp wire.Type, opts unmarshalOptions) (interface{}, int, error) {
  416. p := pointerOfIface(ival)
  417. n, err := consumeMessageSlice(b, p, reflect.TypeOf(ival).Elem().Elem(), wtyp, opts)
  418. return ival, n, err
  419. }
  420. func isInitMessageSliceIface(ival interface{}) error {
  421. p := pointerOfIface(ival)
  422. return isInitMessageSlice(p, reflect.TypeOf(ival).Elem().Elem())
  423. }
  424. var coderMessageSliceIface = ifaceCoderFuncs{
  425. size: sizeMessageSliceIface,
  426. marshal: appendMessageSliceIface,
  427. unmarshal: consumeMessageSliceIface,
  428. isInit: isInitMessageSliceIface,
  429. }
  430. func makeGroupSliceFieldCoder(fd pref.FieldDescriptor, ft reflect.Type) pointerCoderFuncs {
  431. num := fd.Number()
  432. if mi := getMessageInfo(ft); mi != nil {
  433. return pointerCoderFuncs{
  434. size: func(p pointer, tagsize int, opts marshalOptions) int {
  435. return sizeGroupSliceInfo(p, mi, tagsize, opts)
  436. },
  437. marshal: func(b []byte, p pointer, wiretag uint64, opts marshalOptions) ([]byte, error) {
  438. return appendGroupSliceInfo(b, p, wiretag, mi, opts)
  439. },
  440. unmarshal: func(b []byte, p pointer, wtyp wire.Type, opts unmarshalOptions) (int, error) {
  441. return consumeGroupSliceInfo(b, p, num, wtyp, mi, opts)
  442. },
  443. isInit: func(p pointer) error {
  444. return isInitMessageSliceInfo(p, mi)
  445. },
  446. }
  447. }
  448. return pointerCoderFuncs{
  449. size: func(p pointer, tagsize int, opts marshalOptions) int {
  450. return sizeGroupSlice(p, ft, tagsize, opts)
  451. },
  452. marshal: func(b []byte, p pointer, wiretag uint64, opts marshalOptions) ([]byte, error) {
  453. return appendGroupSlice(b, p, wiretag, ft, opts)
  454. },
  455. unmarshal: func(b []byte, p pointer, wtyp wire.Type, opts unmarshalOptions) (int, error) {
  456. return consumeGroupSlice(b, p, num, wtyp, ft, opts)
  457. },
  458. isInit: func(p pointer) error {
  459. return isInitMessageSlice(p, ft)
  460. },
  461. }
  462. }
  463. func sizeGroupSlice(p pointer, messageType reflect.Type, tagsize int, _ marshalOptions) int {
  464. s := p.PointerSlice()
  465. n := 0
  466. for _, v := range s {
  467. m := asMessage(v.AsValueOf(messageType.Elem()))
  468. n += 2*tagsize + proto.Size(m)
  469. }
  470. return n
  471. }
  472. func appendGroupSlice(b []byte, p pointer, wiretag uint64, messageType reflect.Type, opts marshalOptions) ([]byte, error) {
  473. s := p.PointerSlice()
  474. var err error
  475. for _, v := range s {
  476. m := asMessage(v.AsValueOf(messageType.Elem()))
  477. b = wire.AppendVarint(b, wiretag) // start group
  478. b, err = opts.Options().MarshalAppend(b, m)
  479. if err != nil {
  480. return b, err
  481. }
  482. b = wire.AppendVarint(b, wiretag+1) // end group
  483. }
  484. return b, nil
  485. }
  486. func consumeGroupSlice(b []byte, p pointer, num wire.Number, wtyp wire.Type, goType reflect.Type, opts unmarshalOptions) (int, error) {
  487. if wtyp != wire.StartGroupType {
  488. return 0, errUnknown
  489. }
  490. b, n := wire.ConsumeGroup(num, b)
  491. if n < 0 {
  492. return 0, wire.ParseError(n)
  493. }
  494. mp := reflect.New(goType.Elem())
  495. if err := opts.Options().Unmarshal(b, asMessage(mp)); err != nil {
  496. return 0, err
  497. }
  498. p.AppendPointerSlice(pointerOfValue(mp))
  499. return n, nil
  500. }
  501. func sizeGroupSliceInfo(p pointer, mi *MessageInfo, tagsize int, opts marshalOptions) int {
  502. s := p.PointerSlice()
  503. n := 0
  504. for _, v := range s {
  505. n += 2*tagsize + mi.sizePointer(v, opts)
  506. }
  507. return n
  508. }
  509. func appendGroupSliceInfo(b []byte, p pointer, wiretag uint64, mi *MessageInfo, opts marshalOptions) ([]byte, error) {
  510. s := p.PointerSlice()
  511. var err error
  512. for _, v := range s {
  513. b = wire.AppendVarint(b, wiretag) // start group
  514. b, err = mi.marshalAppendPointer(b, v, opts)
  515. if err != nil {
  516. return b, err
  517. }
  518. b = wire.AppendVarint(b, wiretag+1) // end group
  519. }
  520. return b, nil
  521. }
  522. func consumeGroupSliceInfo(b []byte, p pointer, num wire.Number, wtyp wire.Type, mi *MessageInfo, opts unmarshalOptions) (int, error) {
  523. if wtyp != wire.StartGroupType {
  524. return 0, errUnknown
  525. }
  526. m := reflect.New(mi.GoType.Elem()).Interface()
  527. mp := pointerOfIface(m)
  528. n, err := mi.unmarshalPointer(b, mp, num, opts)
  529. if err != nil {
  530. return 0, err
  531. }
  532. p.AppendPointerSlice(mp)
  533. return n, nil
  534. }
  535. func sizeGroupSliceIface(ival interface{}, tagsize int, opts marshalOptions) int {
  536. p := pointerOfIface(ival)
  537. return sizeGroupSlice(p, reflect.TypeOf(ival).Elem().Elem(), tagsize, opts)
  538. }
  539. func appendGroupSliceIface(b []byte, ival interface{}, wiretag uint64, opts marshalOptions) ([]byte, error) {
  540. p := pointerOfIface(ival)
  541. return appendGroupSlice(b, p, wiretag, reflect.TypeOf(ival).Elem().Elem(), opts)
  542. }
  543. func consumeGroupSliceIface(b []byte, ival interface{}, num wire.Number, wtyp wire.Type, opts unmarshalOptions) (interface{}, int, error) {
  544. p := pointerOfIface(ival)
  545. n, err := consumeGroupSlice(b, p, num, wtyp, reflect.TypeOf(ival).Elem().Elem(), opts)
  546. return ival, n, err
  547. }
  548. var coderGroupSliceIface = ifaceCoderFuncs{
  549. size: sizeGroupSliceIface,
  550. marshal: appendGroupSliceIface,
  551. unmarshal: consumeGroupSliceIface,
  552. isInit: isInitMessageSliceIface,
  553. }
  554. // Enums
  555. func sizeEnumIface(ival interface{}, tagsize int, _ marshalOptions) (n int) {
  556. v := reflect.ValueOf(ival).Int()
  557. return wire.SizeVarint(uint64(v)) + tagsize
  558. }
  559. func appendEnumIface(b []byte, ival interface{}, wiretag uint64, _ marshalOptions) ([]byte, error) {
  560. v := reflect.ValueOf(ival).Int()
  561. b = wire.AppendVarint(b, wiretag)
  562. b = wire.AppendVarint(b, uint64(v))
  563. return b, nil
  564. }
  565. func consumeEnumIface(b []byte, ival interface{}, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (interface{}, int, error) {
  566. if wtyp != wire.VarintType {
  567. return nil, 0, errUnknown
  568. }
  569. v, n := wire.ConsumeVarint(b)
  570. if n < 0 {
  571. return nil, 0, wire.ParseError(n)
  572. }
  573. rv := reflect.New(reflect.TypeOf(ival)).Elem()
  574. rv.SetInt(int64(v))
  575. return rv.Interface(), n, nil
  576. }
  577. var coderEnumIface = ifaceCoderFuncs{
  578. size: sizeEnumIface,
  579. marshal: appendEnumIface,
  580. unmarshal: consumeEnumIface,
  581. }
  582. func sizeEnumSliceIface(ival interface{}, tagsize int, opts marshalOptions) (size int) {
  583. return sizeEnumSliceReflect(reflect.ValueOf(ival).Elem(), tagsize, opts)
  584. }
  585. func sizeEnumSliceReflect(s reflect.Value, tagsize int, _ marshalOptions) (size int) {
  586. for i, llen := 0, s.Len(); i < llen; i++ {
  587. size += wire.SizeVarint(uint64(s.Index(i).Int())) + tagsize
  588. }
  589. return size
  590. }
  591. func appendEnumSliceIface(b []byte, ival interface{}, wiretag uint64, opts marshalOptions) ([]byte, error) {
  592. return appendEnumSliceReflect(b, reflect.ValueOf(ival).Elem(), wiretag, opts)
  593. }
  594. func appendEnumSliceReflect(b []byte, s reflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
  595. for i, llen := 0, s.Len(); i < llen; i++ {
  596. b = wire.AppendVarint(b, wiretag)
  597. b = wire.AppendVarint(b, uint64(s.Index(i).Int()))
  598. }
  599. return b, nil
  600. }
  601. func consumeEnumSliceIface(b []byte, ival interface{}, _ wire.Number, wtyp wire.Type, opts unmarshalOptions) (interface{}, int, error) {
  602. n, err := consumeEnumSliceReflect(b, reflect.ValueOf(ival), wtyp, opts)
  603. return ival, n, err
  604. }
  605. func consumeEnumSliceReflect(b []byte, s reflect.Value, wtyp wire.Type, _ unmarshalOptions) (n int, err error) {
  606. s = s.Elem() // *[]E -> []E
  607. if wtyp == wire.BytesType {
  608. b, n = wire.ConsumeBytes(b)
  609. if n < 0 {
  610. return 0, wire.ParseError(n)
  611. }
  612. for len(b) > 0 {
  613. v, n := wire.ConsumeVarint(b)
  614. if n < 0 {
  615. return 0, wire.ParseError(n)
  616. }
  617. rv := reflect.New(s.Type().Elem()).Elem()
  618. rv.SetInt(int64(v))
  619. s.Set(reflect.Append(s, rv))
  620. b = b[n:]
  621. }
  622. return n, nil
  623. }
  624. if wtyp != wire.VarintType {
  625. return 0, errUnknown
  626. }
  627. v, n := wire.ConsumeVarint(b)
  628. if n < 0 {
  629. return 0, wire.ParseError(n)
  630. }
  631. rv := reflect.New(s.Type().Elem()).Elem()
  632. rv.SetInt(int64(v))
  633. s.Set(reflect.Append(s, rv))
  634. return n, nil
  635. }
  636. var coderEnumSliceIface = ifaceCoderFuncs{
  637. size: sizeEnumSliceIface,
  638. marshal: appendEnumSliceIface,
  639. unmarshal: consumeEnumSliceIface,
  640. }
  641. func sizeEnumPackedSliceIface(ival interface{}, tagsize int, opts marshalOptions) (size int) {
  642. return sizeEnumPackedSliceReflect(reflect.ValueOf(ival).Elem(), tagsize, opts)
  643. }
  644. func sizeEnumPackedSliceReflect(s reflect.Value, tagsize int, _ marshalOptions) (size int) {
  645. llen := s.Len()
  646. if llen == 0 {
  647. return 0
  648. }
  649. n := 0
  650. for i := 0; i < llen; i++ {
  651. n += wire.SizeVarint(uint64(s.Index(i).Int()))
  652. }
  653. return tagsize + wire.SizeBytes(n)
  654. }
  655. func appendEnumPackedSliceIface(b []byte, ival interface{}, wiretag uint64, opts marshalOptions) ([]byte, error) {
  656. return appendEnumPackedSliceReflect(b, reflect.ValueOf(ival).Elem(), wiretag, opts)
  657. }
  658. func appendEnumPackedSliceReflect(b []byte, s reflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
  659. llen := s.Len()
  660. if llen == 0 {
  661. return b, nil
  662. }
  663. b = wire.AppendVarint(b, wiretag)
  664. n := 0
  665. for i := 0; i < llen; i++ {
  666. n += wire.SizeVarint(uint64(s.Index(i).Int()))
  667. }
  668. b = wire.AppendVarint(b, uint64(n))
  669. for i := 0; i < llen; i++ {
  670. b = wire.AppendVarint(b, uint64(s.Index(i).Int()))
  671. }
  672. return b, nil
  673. }
  674. var coderEnumPackedSliceIface = ifaceCoderFuncs{
  675. size: sizeEnumPackedSliceIface,
  676. marshal: appendEnumPackedSliceIface,
  677. unmarshal: consumeEnumSliceIface,
  678. }
  679. func asMessage(v reflect.Value) pref.ProtoMessage {
  680. if m, ok := v.Interface().(pref.ProtoMessage); ok {
  681. return m
  682. }
  683. return legacyWrapMessage(v)
  684. }