codec_field.go 26 KB

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