codec_tables.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584
  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. "fmt"
  7. "reflect"
  8. "google.golang.org/protobuf/internal/encoding/wire"
  9. pref "google.golang.org/protobuf/reflect/protoreflect"
  10. )
  11. // pointerCoderFuncs is a set of pointer encoding functions.
  12. type pointerCoderFuncs struct {
  13. size func(p pointer, tagsize int, opts marshalOptions) int
  14. marshal func(b []byte, p pointer, wiretag uint64, opts marshalOptions) ([]byte, error)
  15. unmarshal func(b []byte, p pointer, wtyp wire.Type, opts unmarshalOptions) (int, error)
  16. isInit func(p pointer) error
  17. }
  18. // ifaceCoderFuncs is a set of interface{} encoding functions.
  19. type ifaceCoderFuncs struct {
  20. size func(ival interface{}, tagsize int, opts marshalOptions) int
  21. marshal func(b []byte, ival interface{}, wiretag uint64, opts marshalOptions) ([]byte, error)
  22. unmarshal func(b []byte, ival interface{}, num wire.Number, wtyp wire.Type, opts unmarshalOptions) (interface{}, int, error)
  23. isInit func(ival interface{}) error
  24. }
  25. // fieldCoder returns pointer functions for a field, used for operating on
  26. // struct fields.
  27. func fieldCoder(fd pref.FieldDescriptor, ft reflect.Type) pointerCoderFuncs {
  28. switch {
  29. case fd.IsMap():
  30. return encoderFuncsForMap(fd, ft)
  31. case fd.Cardinality() == pref.Repeated && !fd.IsPacked():
  32. // Repeated fields (not packed).
  33. if ft.Kind() != reflect.Slice {
  34. break
  35. }
  36. ft := ft.Elem()
  37. switch fd.Kind() {
  38. case pref.BoolKind:
  39. if ft.Kind() == reflect.Bool {
  40. return coderBoolSlice
  41. }
  42. case pref.EnumKind:
  43. if ft.Kind() == reflect.Int32 {
  44. return coderEnumSlice
  45. }
  46. case pref.Int32Kind:
  47. if ft.Kind() == reflect.Int32 {
  48. return coderInt32Slice
  49. }
  50. case pref.Sint32Kind:
  51. if ft.Kind() == reflect.Int32 {
  52. return coderSint32Slice
  53. }
  54. case pref.Uint32Kind:
  55. if ft.Kind() == reflect.Uint32 {
  56. return coderUint32Slice
  57. }
  58. case pref.Int64Kind:
  59. if ft.Kind() == reflect.Int64 {
  60. return coderInt64Slice
  61. }
  62. case pref.Sint64Kind:
  63. if ft.Kind() == reflect.Int64 {
  64. return coderSint64Slice
  65. }
  66. case pref.Uint64Kind:
  67. if ft.Kind() == reflect.Uint64 {
  68. return coderUint64Slice
  69. }
  70. case pref.Sfixed32Kind:
  71. if ft.Kind() == reflect.Int32 {
  72. return coderSfixed32Slice
  73. }
  74. case pref.Fixed32Kind:
  75. if ft.Kind() == reflect.Uint32 {
  76. return coderFixed32Slice
  77. }
  78. case pref.FloatKind:
  79. if ft.Kind() == reflect.Float32 {
  80. return coderFloatSlice
  81. }
  82. case pref.Sfixed64Kind:
  83. if ft.Kind() == reflect.Int64 {
  84. return coderSfixed64Slice
  85. }
  86. case pref.Fixed64Kind:
  87. if ft.Kind() == reflect.Uint64 {
  88. return coderFixed64Slice
  89. }
  90. case pref.DoubleKind:
  91. if ft.Kind() == reflect.Float64 {
  92. return coderDoubleSlice
  93. }
  94. case pref.StringKind:
  95. if ft.Kind() == reflect.String && fd.Syntax() == pref.Proto3 {
  96. return coderStringSliceValidateUTF8
  97. }
  98. if ft.Kind() == reflect.String {
  99. return coderStringSlice
  100. }
  101. if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
  102. return coderBytesSlice
  103. }
  104. case pref.BytesKind:
  105. if ft.Kind() == reflect.String {
  106. return coderStringSlice
  107. }
  108. if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
  109. return coderBytesSlice
  110. }
  111. case pref.MessageKind:
  112. return makeMessageSliceFieldCoder(fd, ft)
  113. case pref.GroupKind:
  114. return makeGroupSliceFieldCoder(fd, ft)
  115. }
  116. case fd.Cardinality() == pref.Repeated && fd.IsPacked():
  117. // Packed repeated fields.
  118. //
  119. // Only repeated fields of primitive numeric types
  120. // (Varint, Fixed32, or Fixed64 wire type) can be packed.
  121. if ft.Kind() != reflect.Slice {
  122. break
  123. }
  124. ft := ft.Elem()
  125. switch fd.Kind() {
  126. case pref.BoolKind:
  127. if ft.Kind() == reflect.Bool {
  128. return coderBoolPackedSlice
  129. }
  130. case pref.EnumKind:
  131. if ft.Kind() == reflect.Int32 {
  132. return coderEnumPackedSlice
  133. }
  134. case pref.Int32Kind:
  135. if ft.Kind() == reflect.Int32 {
  136. return coderInt32PackedSlice
  137. }
  138. case pref.Sint32Kind:
  139. if ft.Kind() == reflect.Int32 {
  140. return coderSint32PackedSlice
  141. }
  142. case pref.Uint32Kind:
  143. if ft.Kind() == reflect.Uint32 {
  144. return coderUint32PackedSlice
  145. }
  146. case pref.Int64Kind:
  147. if ft.Kind() == reflect.Int64 {
  148. return coderInt64PackedSlice
  149. }
  150. case pref.Sint64Kind:
  151. if ft.Kind() == reflect.Int64 {
  152. return coderSint64PackedSlice
  153. }
  154. case pref.Uint64Kind:
  155. if ft.Kind() == reflect.Uint64 {
  156. return coderUint64PackedSlice
  157. }
  158. case pref.Sfixed32Kind:
  159. if ft.Kind() == reflect.Int32 {
  160. return coderSfixed32PackedSlice
  161. }
  162. case pref.Fixed32Kind:
  163. if ft.Kind() == reflect.Uint32 {
  164. return coderFixed32PackedSlice
  165. }
  166. case pref.FloatKind:
  167. if ft.Kind() == reflect.Float32 {
  168. return coderFloatPackedSlice
  169. }
  170. case pref.Sfixed64Kind:
  171. if ft.Kind() == reflect.Int64 {
  172. return coderSfixed64PackedSlice
  173. }
  174. case pref.Fixed64Kind:
  175. if ft.Kind() == reflect.Uint64 {
  176. return coderFixed64PackedSlice
  177. }
  178. case pref.DoubleKind:
  179. if ft.Kind() == reflect.Float64 {
  180. return coderDoublePackedSlice
  181. }
  182. }
  183. case fd.Kind() == pref.MessageKind:
  184. return makeMessageFieldCoder(fd, ft)
  185. case fd.Kind() == pref.GroupKind:
  186. return makeGroupFieldCoder(fd, ft)
  187. case fd.Syntax() == pref.Proto3 && fd.ContainingOneof() == nil:
  188. // Populated oneof fields always encode even if set to the zero value,
  189. // which normally are not encoded in proto3.
  190. switch fd.Kind() {
  191. case pref.BoolKind:
  192. if ft.Kind() == reflect.Bool {
  193. return coderBoolNoZero
  194. }
  195. case pref.EnumKind:
  196. if ft.Kind() == reflect.Int32 {
  197. return coderEnumNoZero
  198. }
  199. case pref.Int32Kind:
  200. if ft.Kind() == reflect.Int32 {
  201. return coderInt32NoZero
  202. }
  203. case pref.Sint32Kind:
  204. if ft.Kind() == reflect.Int32 {
  205. return coderSint32NoZero
  206. }
  207. case pref.Uint32Kind:
  208. if ft.Kind() == reflect.Uint32 {
  209. return coderUint32NoZero
  210. }
  211. case pref.Int64Kind:
  212. if ft.Kind() == reflect.Int64 {
  213. return coderInt64NoZero
  214. }
  215. case pref.Sint64Kind:
  216. if ft.Kind() == reflect.Int64 {
  217. return coderSint64NoZero
  218. }
  219. case pref.Uint64Kind:
  220. if ft.Kind() == reflect.Uint64 {
  221. return coderUint64NoZero
  222. }
  223. case pref.Sfixed32Kind:
  224. if ft.Kind() == reflect.Int32 {
  225. return coderSfixed32NoZero
  226. }
  227. case pref.Fixed32Kind:
  228. if ft.Kind() == reflect.Uint32 {
  229. return coderFixed32NoZero
  230. }
  231. case pref.FloatKind:
  232. if ft.Kind() == reflect.Float32 {
  233. return coderFloatNoZero
  234. }
  235. case pref.Sfixed64Kind:
  236. if ft.Kind() == reflect.Int64 {
  237. return coderSfixed64NoZero
  238. }
  239. case pref.Fixed64Kind:
  240. if ft.Kind() == reflect.Uint64 {
  241. return coderFixed64NoZero
  242. }
  243. case pref.DoubleKind:
  244. if ft.Kind() == reflect.Float64 {
  245. return coderDoubleNoZero
  246. }
  247. case pref.StringKind:
  248. if ft.Kind() == reflect.String {
  249. return coderStringNoZeroValidateUTF8
  250. }
  251. if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
  252. return coderBytesNoZero
  253. }
  254. case pref.BytesKind:
  255. if ft.Kind() == reflect.String {
  256. return coderStringNoZero
  257. }
  258. if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
  259. return coderBytesNoZero
  260. }
  261. }
  262. case ft.Kind() == reflect.Ptr:
  263. ft := ft.Elem()
  264. switch fd.Kind() {
  265. case pref.BoolKind:
  266. if ft.Kind() == reflect.Bool {
  267. return coderBoolPtr
  268. }
  269. case pref.EnumKind:
  270. if ft.Kind() == reflect.Int32 {
  271. return coderEnumPtr
  272. }
  273. case pref.Int32Kind:
  274. if ft.Kind() == reflect.Int32 {
  275. return coderInt32Ptr
  276. }
  277. case pref.Sint32Kind:
  278. if ft.Kind() == reflect.Int32 {
  279. return coderSint32Ptr
  280. }
  281. case pref.Uint32Kind:
  282. if ft.Kind() == reflect.Uint32 {
  283. return coderUint32Ptr
  284. }
  285. case pref.Int64Kind:
  286. if ft.Kind() == reflect.Int64 {
  287. return coderInt64Ptr
  288. }
  289. case pref.Sint64Kind:
  290. if ft.Kind() == reflect.Int64 {
  291. return coderSint64Ptr
  292. }
  293. case pref.Uint64Kind:
  294. if ft.Kind() == reflect.Uint64 {
  295. return coderUint64Ptr
  296. }
  297. case pref.Sfixed32Kind:
  298. if ft.Kind() == reflect.Int32 {
  299. return coderSfixed32Ptr
  300. }
  301. case pref.Fixed32Kind:
  302. if ft.Kind() == reflect.Uint32 {
  303. return coderFixed32Ptr
  304. }
  305. case pref.FloatKind:
  306. if ft.Kind() == reflect.Float32 {
  307. return coderFloatPtr
  308. }
  309. case pref.Sfixed64Kind:
  310. if ft.Kind() == reflect.Int64 {
  311. return coderSfixed64Ptr
  312. }
  313. case pref.Fixed64Kind:
  314. if ft.Kind() == reflect.Uint64 {
  315. return coderFixed64Ptr
  316. }
  317. case pref.DoubleKind:
  318. if ft.Kind() == reflect.Float64 {
  319. return coderDoublePtr
  320. }
  321. case pref.StringKind:
  322. if ft.Kind() == reflect.String {
  323. return coderStringPtr
  324. }
  325. case pref.BytesKind:
  326. if ft.Kind() == reflect.String {
  327. return coderStringPtr
  328. }
  329. }
  330. default:
  331. switch fd.Kind() {
  332. case pref.BoolKind:
  333. if ft.Kind() == reflect.Bool {
  334. return coderBool
  335. }
  336. case pref.EnumKind:
  337. if ft.Kind() == reflect.Int32 {
  338. return coderEnum
  339. }
  340. case pref.Int32Kind:
  341. if ft.Kind() == reflect.Int32 {
  342. return coderInt32
  343. }
  344. case pref.Sint32Kind:
  345. if ft.Kind() == reflect.Int32 {
  346. return coderSint32
  347. }
  348. case pref.Uint32Kind:
  349. if ft.Kind() == reflect.Uint32 {
  350. return coderUint32
  351. }
  352. case pref.Int64Kind:
  353. if ft.Kind() == reflect.Int64 {
  354. return coderInt64
  355. }
  356. case pref.Sint64Kind:
  357. if ft.Kind() == reflect.Int64 {
  358. return coderSint64
  359. }
  360. case pref.Uint64Kind:
  361. if ft.Kind() == reflect.Uint64 {
  362. return coderUint64
  363. }
  364. case pref.Sfixed32Kind:
  365. if ft.Kind() == reflect.Int32 {
  366. return coderSfixed32
  367. }
  368. case pref.Fixed32Kind:
  369. if ft.Kind() == reflect.Uint32 {
  370. return coderFixed32
  371. }
  372. case pref.FloatKind:
  373. if ft.Kind() == reflect.Float32 {
  374. return coderFloat
  375. }
  376. case pref.Sfixed64Kind:
  377. if ft.Kind() == reflect.Int64 {
  378. return coderSfixed64
  379. }
  380. case pref.Fixed64Kind:
  381. if ft.Kind() == reflect.Uint64 {
  382. return coderFixed64
  383. }
  384. case pref.DoubleKind:
  385. if ft.Kind() == reflect.Float64 {
  386. return coderDouble
  387. }
  388. case pref.StringKind:
  389. if fd.Syntax() == pref.Proto3 && ft.Kind() == reflect.String {
  390. return coderStringValidateUTF8
  391. }
  392. if ft.Kind() == reflect.String {
  393. return coderString
  394. }
  395. if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
  396. return coderBytes
  397. }
  398. case pref.BytesKind:
  399. if ft.Kind() == reflect.String {
  400. return coderString
  401. }
  402. if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
  403. return coderBytes
  404. }
  405. }
  406. }
  407. panic(fmt.Errorf("invalid type: no encoder for %v %v %v/%v", fd.FullName(), fd.Cardinality(), fd.Kind(), ft))
  408. }
  409. // encoderFuncsForValue returns interface{} value functions for a field, used for
  410. // extension values and map encoding.
  411. func encoderFuncsForValue(fd pref.FieldDescriptor, ft reflect.Type) ifaceCoderFuncs {
  412. switch {
  413. case fd.Cardinality() == pref.Repeated && !fd.IsPacked():
  414. if ft.Kind() != reflect.Ptr || ft.Elem().Kind() != reflect.Slice {
  415. break
  416. }
  417. ft := ft.Elem().Elem()
  418. switch fd.Kind() {
  419. case pref.BoolKind:
  420. if ft.Kind() == reflect.Bool {
  421. return coderBoolSliceIface
  422. }
  423. case pref.EnumKind:
  424. if ft.Kind() == reflect.Int32 {
  425. return coderEnumSliceIface
  426. }
  427. case pref.Int32Kind:
  428. if ft.Kind() == reflect.Int32 {
  429. return coderInt32SliceIface
  430. }
  431. case pref.Sint32Kind:
  432. if ft.Kind() == reflect.Int32 {
  433. return coderSint32SliceIface
  434. }
  435. case pref.Uint32Kind:
  436. if ft.Kind() == reflect.Uint32 {
  437. return coderUint32SliceIface
  438. }
  439. case pref.Int64Kind:
  440. if ft.Kind() == reflect.Int64 {
  441. return coderInt64SliceIface
  442. }
  443. case pref.Sint64Kind:
  444. if ft.Kind() == reflect.Int64 {
  445. return coderSint64SliceIface
  446. }
  447. case pref.Uint64Kind:
  448. if ft.Kind() == reflect.Uint64 {
  449. return coderUint64SliceIface
  450. }
  451. case pref.Sfixed32Kind:
  452. if ft.Kind() == reflect.Int32 {
  453. return coderSfixed32SliceIface
  454. }
  455. case pref.Fixed32Kind:
  456. if ft.Kind() == reflect.Uint32 {
  457. return coderFixed32SliceIface
  458. }
  459. case pref.FloatKind:
  460. if ft.Kind() == reflect.Float32 {
  461. return coderFloatSliceIface
  462. }
  463. case pref.Sfixed64Kind:
  464. if ft.Kind() == reflect.Int64 {
  465. return coderSfixed64SliceIface
  466. }
  467. case pref.Fixed64Kind:
  468. if ft.Kind() == reflect.Uint64 {
  469. return coderFixed64SliceIface
  470. }
  471. case pref.DoubleKind:
  472. if ft.Kind() == reflect.Float64 {
  473. return coderDoubleSliceIface
  474. }
  475. case pref.StringKind:
  476. if ft.Kind() == reflect.String {
  477. return coderStringSliceIface
  478. }
  479. if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
  480. return coderBytesSliceIface
  481. }
  482. case pref.BytesKind:
  483. if ft.Kind() == reflect.String {
  484. return coderStringSliceIface
  485. }
  486. if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
  487. return coderBytesSliceIface
  488. }
  489. case pref.MessageKind:
  490. return coderMessageSliceIface
  491. case pref.GroupKind:
  492. return coderGroupSliceIface
  493. }
  494. case fd.Cardinality() == pref.Repeated && fd.IsPacked():
  495. default:
  496. switch fd.Kind() {
  497. case pref.BoolKind:
  498. if ft.Kind() == reflect.Bool {
  499. return coderBoolIface
  500. }
  501. case pref.EnumKind:
  502. if ft.Kind() == reflect.Int32 {
  503. return coderEnumIface
  504. }
  505. case pref.Int32Kind:
  506. if ft.Kind() == reflect.Int32 {
  507. return coderInt32Iface
  508. }
  509. case pref.Sint32Kind:
  510. if ft.Kind() == reflect.Int32 {
  511. return coderSint32Iface
  512. }
  513. case pref.Uint32Kind:
  514. if ft.Kind() == reflect.Uint32 {
  515. return coderUint32Iface
  516. }
  517. case pref.Int64Kind:
  518. if ft.Kind() == reflect.Int64 {
  519. return coderInt64Iface
  520. }
  521. case pref.Sint64Kind:
  522. if ft.Kind() == reflect.Int64 {
  523. return coderSint64Iface
  524. }
  525. case pref.Uint64Kind:
  526. if ft.Kind() == reflect.Uint64 {
  527. return coderUint64Iface
  528. }
  529. case pref.Sfixed32Kind:
  530. if ft.Kind() == reflect.Int32 {
  531. return coderSfixed32Iface
  532. }
  533. case pref.Fixed32Kind:
  534. if ft.Kind() == reflect.Uint32 {
  535. return coderFixed32Iface
  536. }
  537. case pref.FloatKind:
  538. if ft.Kind() == reflect.Float32 {
  539. return coderFloatIface
  540. }
  541. case pref.Sfixed64Kind:
  542. if ft.Kind() == reflect.Int64 {
  543. return coderSfixed64Iface
  544. }
  545. case pref.Fixed64Kind:
  546. if ft.Kind() == reflect.Uint64 {
  547. return coderFixed64Iface
  548. }
  549. case pref.DoubleKind:
  550. if ft.Kind() == reflect.Float64 {
  551. return coderDoubleIface
  552. }
  553. case pref.StringKind:
  554. if fd.Syntax() == pref.Proto3 && ft.Kind() == reflect.String {
  555. return coderStringIfaceValidateUTF8
  556. }
  557. if ft.Kind() == reflect.String {
  558. return coderStringIface
  559. }
  560. if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
  561. return coderBytesIface
  562. }
  563. case pref.BytesKind:
  564. if ft.Kind() == reflect.String {
  565. return coderStringIface
  566. }
  567. if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
  568. return coderBytesIface
  569. }
  570. case pref.MessageKind:
  571. return coderMessageIface
  572. case pref.GroupKind:
  573. return makeGroupValueCoder(fd, ft)
  574. }
  575. }
  576. panic(fmt.Errorf("invalid type: no encoder for %v %v %v/%v", fd.FullName(), fd.Cardinality(), fd.Kind(), ft))
  577. }