codec_field.go 24 KB

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