feature_reflect_object.go 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083
  1. package jsoniter
  2. import (
  3. "fmt"
  4. "io"
  5. "reflect"
  6. "unsafe"
  7. )
  8. func encoderOfStruct(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  9. fieldsByToName := map[string]int{}
  10. orderedFields := []*structFieldTo{}
  11. structDescriptor, err := describeStruct(cfg, typ)
  12. if err != nil {
  13. return nil, err
  14. }
  15. for index, binding := range structDescriptor.Fields {
  16. for _, toName := range binding.ToNames {
  17. oldIndex, found := fieldsByToName[toName]
  18. if found {
  19. orderedFields[oldIndex] = nil // replaced by the later one
  20. }
  21. fieldsByToName[toName] = index
  22. orderedFields = append(orderedFields, &structFieldTo{
  23. binding.Encoder.(*structFieldEncoder),
  24. toName,
  25. })
  26. }
  27. }
  28. if len(orderedFields) == 0 {
  29. return &emptyStructEncoder{}, nil
  30. }
  31. finalOrderedFields := []structFieldTo{}
  32. for _, structFieldTo := range orderedFields {
  33. if structFieldTo != nil {
  34. finalOrderedFields = append(finalOrderedFields, *structFieldTo)
  35. }
  36. }
  37. return &structEncoder{finalOrderedFields}, nil
  38. }
  39. func decoderOfStruct(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) {
  40. fields := map[string]*structFieldDecoder{}
  41. structDescriptor, err := describeStruct(cfg, typ)
  42. if err != nil {
  43. return nil, err
  44. }
  45. for _, binding := range structDescriptor.Fields {
  46. for _, fromName := range binding.FromNames {
  47. fields[fromName] = binding.Decoder.(*structFieldDecoder)
  48. }
  49. }
  50. return createStructDecoder(typ, fields)
  51. }
  52. func createStructDecoder(typ reflect.Type, fields map[string]*structFieldDecoder) (ValDecoder, error) {
  53. knownHash := map[int32]struct{}{
  54. 0: {},
  55. }
  56. switch len(fields) {
  57. case 0:
  58. return &skipDecoder{typ}, nil
  59. case 1:
  60. for fieldName, fieldDecoder := range fields {
  61. fieldHash := calcHash(fieldName)
  62. _, known := knownHash[fieldHash]
  63. if known {
  64. return &generalStructDecoder{typ, fields}, nil
  65. } else {
  66. knownHash[fieldHash] = struct{}{}
  67. }
  68. return &oneFieldStructDecoder{typ, fieldHash, fieldDecoder}, nil
  69. }
  70. case 2:
  71. var fieldHash1 int32
  72. var fieldHash2 int32
  73. var fieldDecoder1 *structFieldDecoder
  74. var fieldDecoder2 *structFieldDecoder
  75. for fieldName, fieldDecoder := range fields {
  76. fieldHash := calcHash(fieldName)
  77. _, known := knownHash[fieldHash]
  78. if known {
  79. return &generalStructDecoder{typ, fields}, nil
  80. } else {
  81. knownHash[fieldHash] = struct{}{}
  82. }
  83. if fieldHash1 == 0 {
  84. fieldHash1 = fieldHash
  85. fieldDecoder1 = fieldDecoder
  86. } else {
  87. fieldHash2 = fieldHash
  88. fieldDecoder2 = fieldDecoder
  89. }
  90. }
  91. return &twoFieldsStructDecoder{typ, fieldHash1, fieldDecoder1, fieldHash2, fieldDecoder2}, nil
  92. case 3:
  93. var fieldName1 int32
  94. var fieldName2 int32
  95. var fieldName3 int32
  96. var fieldDecoder1 *structFieldDecoder
  97. var fieldDecoder2 *structFieldDecoder
  98. var fieldDecoder3 *structFieldDecoder
  99. for fieldName, fieldDecoder := range fields {
  100. fieldHash := calcHash(fieldName)
  101. _, known := knownHash[fieldHash]
  102. if known {
  103. return &generalStructDecoder{typ, fields}, nil
  104. } else {
  105. knownHash[fieldHash] = struct{}{}
  106. }
  107. if fieldName1 == 0 {
  108. fieldName1 = fieldHash
  109. fieldDecoder1 = fieldDecoder
  110. } else if fieldName2 == 0 {
  111. fieldName2 = fieldHash
  112. fieldDecoder2 = fieldDecoder
  113. } else {
  114. fieldName3 = fieldHash
  115. fieldDecoder3 = fieldDecoder
  116. }
  117. }
  118. return &threeFieldsStructDecoder{typ,
  119. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3}, nil
  120. case 4:
  121. var fieldName1 int32
  122. var fieldName2 int32
  123. var fieldName3 int32
  124. var fieldName4 int32
  125. var fieldDecoder1 *structFieldDecoder
  126. var fieldDecoder2 *structFieldDecoder
  127. var fieldDecoder3 *structFieldDecoder
  128. var fieldDecoder4 *structFieldDecoder
  129. for fieldName, fieldDecoder := range fields {
  130. fieldHash := calcHash(fieldName)
  131. _, known := knownHash[fieldHash]
  132. if known {
  133. return &generalStructDecoder{typ, fields}, nil
  134. } else {
  135. knownHash[fieldHash] = struct{}{}
  136. }
  137. if fieldName1 == 0 {
  138. fieldName1 = fieldHash
  139. fieldDecoder1 = fieldDecoder
  140. } else if fieldName2 == 0 {
  141. fieldName2 = fieldHash
  142. fieldDecoder2 = fieldDecoder
  143. } else if fieldName3 == 0 {
  144. fieldName3 = fieldHash
  145. fieldDecoder3 = fieldDecoder
  146. } else {
  147. fieldName4 = fieldHash
  148. fieldDecoder4 = fieldDecoder
  149. }
  150. }
  151. return &fourFieldsStructDecoder{typ,
  152. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
  153. fieldName4, fieldDecoder4}, nil
  154. case 5:
  155. var fieldName1 int32
  156. var fieldName2 int32
  157. var fieldName3 int32
  158. var fieldName4 int32
  159. var fieldName5 int32
  160. var fieldDecoder1 *structFieldDecoder
  161. var fieldDecoder2 *structFieldDecoder
  162. var fieldDecoder3 *structFieldDecoder
  163. var fieldDecoder4 *structFieldDecoder
  164. var fieldDecoder5 *structFieldDecoder
  165. for fieldName, fieldDecoder := range fields {
  166. fieldHash := calcHash(fieldName)
  167. _, known := knownHash[fieldHash]
  168. if known {
  169. return &generalStructDecoder{typ, fields}, nil
  170. } else {
  171. knownHash[fieldHash] = struct{}{}
  172. }
  173. if fieldName1 == 0 {
  174. fieldName1 = fieldHash
  175. fieldDecoder1 = fieldDecoder
  176. } else if fieldName2 == 0 {
  177. fieldName2 = fieldHash
  178. fieldDecoder2 = fieldDecoder
  179. } else if fieldName3 == 0 {
  180. fieldName3 = fieldHash
  181. fieldDecoder3 = fieldDecoder
  182. } else if fieldName4 == 0 {
  183. fieldName4 = fieldHash
  184. fieldDecoder4 = fieldDecoder
  185. } else {
  186. fieldName5 = fieldHash
  187. fieldDecoder5 = fieldDecoder
  188. }
  189. }
  190. return &fiveFieldsStructDecoder{typ,
  191. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
  192. fieldName4, fieldDecoder4, fieldName5, fieldDecoder5}, nil
  193. case 6:
  194. var fieldName1 int32
  195. var fieldName2 int32
  196. var fieldName3 int32
  197. var fieldName4 int32
  198. var fieldName5 int32
  199. var fieldName6 int32
  200. var fieldDecoder1 *structFieldDecoder
  201. var fieldDecoder2 *structFieldDecoder
  202. var fieldDecoder3 *structFieldDecoder
  203. var fieldDecoder4 *structFieldDecoder
  204. var fieldDecoder5 *structFieldDecoder
  205. var fieldDecoder6 *structFieldDecoder
  206. for fieldName, fieldDecoder := range fields {
  207. fieldHash := calcHash(fieldName)
  208. _, known := knownHash[fieldHash]
  209. if known {
  210. return &generalStructDecoder{typ, fields}, nil
  211. } else {
  212. knownHash[fieldHash] = struct{}{}
  213. }
  214. if fieldName1 == 0 {
  215. fieldName1 = fieldHash
  216. fieldDecoder1 = fieldDecoder
  217. } else if fieldName2 == 0 {
  218. fieldName2 = fieldHash
  219. fieldDecoder2 = fieldDecoder
  220. } else if fieldName3 == 0 {
  221. fieldName3 = fieldHash
  222. fieldDecoder3 = fieldDecoder
  223. } else if fieldName4 == 0 {
  224. fieldName4 = fieldHash
  225. fieldDecoder4 = fieldDecoder
  226. } else if fieldName5 == 0 {
  227. fieldName5 = fieldHash
  228. fieldDecoder5 = fieldDecoder
  229. } else {
  230. fieldName6 = fieldHash
  231. fieldDecoder6 = fieldDecoder
  232. }
  233. }
  234. return &sixFieldsStructDecoder{typ,
  235. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
  236. fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6}, nil
  237. case 7:
  238. var fieldName1 int32
  239. var fieldName2 int32
  240. var fieldName3 int32
  241. var fieldName4 int32
  242. var fieldName5 int32
  243. var fieldName6 int32
  244. var fieldName7 int32
  245. var fieldDecoder1 *structFieldDecoder
  246. var fieldDecoder2 *structFieldDecoder
  247. var fieldDecoder3 *structFieldDecoder
  248. var fieldDecoder4 *structFieldDecoder
  249. var fieldDecoder5 *structFieldDecoder
  250. var fieldDecoder6 *structFieldDecoder
  251. var fieldDecoder7 *structFieldDecoder
  252. for fieldName, fieldDecoder := range fields {
  253. fieldHash := calcHash(fieldName)
  254. _, known := knownHash[fieldHash]
  255. if known {
  256. return &generalStructDecoder{typ, fields}, nil
  257. } else {
  258. knownHash[fieldHash] = struct{}{}
  259. }
  260. if fieldName1 == 0 {
  261. fieldName1 = fieldHash
  262. fieldDecoder1 = fieldDecoder
  263. } else if fieldName2 == 0 {
  264. fieldName2 = fieldHash
  265. fieldDecoder2 = fieldDecoder
  266. } else if fieldName3 == 0 {
  267. fieldName3 = fieldHash
  268. fieldDecoder3 = fieldDecoder
  269. } else if fieldName4 == 0 {
  270. fieldName4 = fieldHash
  271. fieldDecoder4 = fieldDecoder
  272. } else if fieldName5 == 0 {
  273. fieldName5 = fieldHash
  274. fieldDecoder5 = fieldDecoder
  275. } else if fieldName6 == 0 {
  276. fieldName6 = fieldHash
  277. fieldDecoder6 = fieldDecoder
  278. } else {
  279. fieldName7 = fieldHash
  280. fieldDecoder7 = fieldDecoder
  281. }
  282. }
  283. return &sevenFieldsStructDecoder{typ,
  284. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
  285. fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6,
  286. fieldName7, fieldDecoder7}, nil
  287. case 8:
  288. var fieldName1 int32
  289. var fieldName2 int32
  290. var fieldName3 int32
  291. var fieldName4 int32
  292. var fieldName5 int32
  293. var fieldName6 int32
  294. var fieldName7 int32
  295. var fieldName8 int32
  296. var fieldDecoder1 *structFieldDecoder
  297. var fieldDecoder2 *structFieldDecoder
  298. var fieldDecoder3 *structFieldDecoder
  299. var fieldDecoder4 *structFieldDecoder
  300. var fieldDecoder5 *structFieldDecoder
  301. var fieldDecoder6 *structFieldDecoder
  302. var fieldDecoder7 *structFieldDecoder
  303. var fieldDecoder8 *structFieldDecoder
  304. for fieldName, fieldDecoder := range fields {
  305. fieldHash := calcHash(fieldName)
  306. _, known := knownHash[fieldHash]
  307. if known {
  308. return &generalStructDecoder{typ, fields}, nil
  309. } else {
  310. knownHash[fieldHash] = struct{}{}
  311. }
  312. if fieldName1 == 0 {
  313. fieldName1 = fieldHash
  314. fieldDecoder1 = fieldDecoder
  315. } else if fieldName2 == 0 {
  316. fieldName2 = fieldHash
  317. fieldDecoder2 = fieldDecoder
  318. } else if fieldName3 == 0 {
  319. fieldName3 = fieldHash
  320. fieldDecoder3 = fieldDecoder
  321. } else if fieldName4 == 0 {
  322. fieldName4 = fieldHash
  323. fieldDecoder4 = fieldDecoder
  324. } else if fieldName5 == 0 {
  325. fieldName5 = fieldHash
  326. fieldDecoder5 = fieldDecoder
  327. } else if fieldName6 == 0 {
  328. fieldName6 = fieldHash
  329. fieldDecoder6 = fieldDecoder
  330. } else if fieldName7 == 0 {
  331. fieldName7 = fieldHash
  332. fieldDecoder7 = fieldDecoder
  333. } else {
  334. fieldName8 = fieldHash
  335. fieldDecoder8 = fieldDecoder
  336. }
  337. }
  338. return &eightFieldsStructDecoder{typ,
  339. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
  340. fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6,
  341. fieldName7, fieldDecoder7, fieldName8, fieldDecoder8}, nil
  342. case 9:
  343. var fieldName1 int32
  344. var fieldName2 int32
  345. var fieldName3 int32
  346. var fieldName4 int32
  347. var fieldName5 int32
  348. var fieldName6 int32
  349. var fieldName7 int32
  350. var fieldName8 int32
  351. var fieldName9 int32
  352. var fieldDecoder1 *structFieldDecoder
  353. var fieldDecoder2 *structFieldDecoder
  354. var fieldDecoder3 *structFieldDecoder
  355. var fieldDecoder4 *structFieldDecoder
  356. var fieldDecoder5 *structFieldDecoder
  357. var fieldDecoder6 *structFieldDecoder
  358. var fieldDecoder7 *structFieldDecoder
  359. var fieldDecoder8 *structFieldDecoder
  360. var fieldDecoder9 *structFieldDecoder
  361. for fieldName, fieldDecoder := range fields {
  362. fieldHash := calcHash(fieldName)
  363. _, known := knownHash[fieldHash]
  364. if known {
  365. return &generalStructDecoder{typ, fields}, nil
  366. } else {
  367. knownHash[fieldHash] = struct{}{}
  368. }
  369. if fieldName1 == 0 {
  370. fieldName1 = fieldHash
  371. fieldDecoder1 = fieldDecoder
  372. } else if fieldName2 == 0 {
  373. fieldName2 = fieldHash
  374. fieldDecoder2 = fieldDecoder
  375. } else if fieldName3 == 0 {
  376. fieldName3 = fieldHash
  377. fieldDecoder3 = fieldDecoder
  378. } else if fieldName4 == 0 {
  379. fieldName4 = fieldHash
  380. fieldDecoder4 = fieldDecoder
  381. } else if fieldName5 == 0 {
  382. fieldName5 = fieldHash
  383. fieldDecoder5 = fieldDecoder
  384. } else if fieldName6 == 0 {
  385. fieldName6 = fieldHash
  386. fieldDecoder6 = fieldDecoder
  387. } else if fieldName7 == 0 {
  388. fieldName7 = fieldHash
  389. fieldDecoder7 = fieldDecoder
  390. } else if fieldName8 == 0 {
  391. fieldName8 = fieldHash
  392. fieldDecoder8 = fieldDecoder
  393. } else {
  394. fieldName9 = fieldHash
  395. fieldDecoder9 = fieldDecoder
  396. }
  397. }
  398. return &nineFieldsStructDecoder{typ,
  399. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
  400. fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6,
  401. fieldName7, fieldDecoder7, fieldName8, fieldDecoder8, fieldName9, fieldDecoder9}, nil
  402. case 10:
  403. var fieldName1 int32
  404. var fieldName2 int32
  405. var fieldName3 int32
  406. var fieldName4 int32
  407. var fieldName5 int32
  408. var fieldName6 int32
  409. var fieldName7 int32
  410. var fieldName8 int32
  411. var fieldName9 int32
  412. var fieldName10 int32
  413. var fieldDecoder1 *structFieldDecoder
  414. var fieldDecoder2 *structFieldDecoder
  415. var fieldDecoder3 *structFieldDecoder
  416. var fieldDecoder4 *structFieldDecoder
  417. var fieldDecoder5 *structFieldDecoder
  418. var fieldDecoder6 *structFieldDecoder
  419. var fieldDecoder7 *structFieldDecoder
  420. var fieldDecoder8 *structFieldDecoder
  421. var fieldDecoder9 *structFieldDecoder
  422. var fieldDecoder10 *structFieldDecoder
  423. for fieldName, fieldDecoder := range fields {
  424. fieldHash := calcHash(fieldName)
  425. _, known := knownHash[fieldHash]
  426. if known {
  427. return &generalStructDecoder{typ, fields}, nil
  428. } else {
  429. knownHash[fieldHash] = struct{}{}
  430. }
  431. if fieldName1 == 0 {
  432. fieldName1 = fieldHash
  433. fieldDecoder1 = fieldDecoder
  434. } else if fieldName2 == 0 {
  435. fieldName2 = fieldHash
  436. fieldDecoder2 = fieldDecoder
  437. } else if fieldName3 == 0 {
  438. fieldName3 = fieldHash
  439. fieldDecoder3 = fieldDecoder
  440. } else if fieldName4 == 0 {
  441. fieldName4 = fieldHash
  442. fieldDecoder4 = fieldDecoder
  443. } else if fieldName5 == 0 {
  444. fieldName5 = fieldHash
  445. fieldDecoder5 = fieldDecoder
  446. } else if fieldName6 == 0 {
  447. fieldName6 = fieldHash
  448. fieldDecoder6 = fieldDecoder
  449. } else if fieldName7 == 0 {
  450. fieldName7 = fieldHash
  451. fieldDecoder7 = fieldDecoder
  452. } else if fieldName8 == 0 {
  453. fieldName8 = fieldHash
  454. fieldDecoder8 = fieldDecoder
  455. } else if fieldName9 == 0 {
  456. fieldName9 = fieldHash
  457. fieldDecoder9 = fieldDecoder
  458. } else {
  459. fieldName10 = fieldHash
  460. fieldDecoder10 = fieldDecoder
  461. }
  462. }
  463. return &tenFieldsStructDecoder{typ,
  464. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
  465. fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6,
  466. fieldName7, fieldDecoder7, fieldName8, fieldDecoder8, fieldName9, fieldDecoder9,
  467. fieldName10, fieldDecoder10}, nil
  468. }
  469. return &generalStructDecoder{typ, fields}, nil
  470. }
  471. type generalStructDecoder struct {
  472. typ reflect.Type
  473. fields map[string]*structFieldDecoder
  474. }
  475. func (decoder *generalStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  476. if !iter.readObjectStart() {
  477. return
  478. }
  479. fieldBytes := iter.readObjectFieldAsBytes()
  480. field := *(*string)(unsafe.Pointer(&fieldBytes))
  481. fieldDecoder := decoder.fields[field]
  482. if fieldDecoder == nil {
  483. iter.Skip()
  484. } else {
  485. fieldDecoder.Decode(ptr, iter)
  486. }
  487. for iter.nextToken() == ',' {
  488. fieldBytes = iter.readObjectFieldAsBytes()
  489. field = *(*string)(unsafe.Pointer(&fieldBytes))
  490. fieldDecoder = decoder.fields[field]
  491. if fieldDecoder == nil {
  492. iter.Skip()
  493. } else {
  494. fieldDecoder.Decode(ptr, iter)
  495. }
  496. }
  497. if iter.Error != nil && iter.Error != io.EOF {
  498. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  499. }
  500. }
  501. type skipDecoder struct {
  502. typ reflect.Type
  503. }
  504. func (decoder *skipDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  505. iter.Skip()
  506. if iter.Error != nil && iter.Error != io.EOF {
  507. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  508. }
  509. }
  510. type oneFieldStructDecoder struct {
  511. typ reflect.Type
  512. fieldHash int32
  513. fieldDecoder *structFieldDecoder
  514. }
  515. func (decoder *oneFieldStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  516. if !iter.readObjectStart() {
  517. return
  518. }
  519. for {
  520. if iter.readFieldHash() == decoder.fieldHash {
  521. decoder.fieldDecoder.Decode(ptr, iter)
  522. } else {
  523. iter.Skip()
  524. }
  525. if iter.nextToken() != ',' {
  526. break
  527. }
  528. }
  529. if iter.Error != nil && iter.Error != io.EOF {
  530. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  531. }
  532. }
  533. type twoFieldsStructDecoder struct {
  534. typ reflect.Type
  535. fieldHash1 int32
  536. fieldDecoder1 *structFieldDecoder
  537. fieldHash2 int32
  538. fieldDecoder2 *structFieldDecoder
  539. }
  540. func (decoder *twoFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  541. if !iter.readObjectStart() {
  542. return
  543. }
  544. for {
  545. switch iter.readFieldHash() {
  546. case decoder.fieldHash1:
  547. decoder.fieldDecoder1.Decode(ptr, iter)
  548. case decoder.fieldHash2:
  549. decoder.fieldDecoder2.Decode(ptr, iter)
  550. default:
  551. iter.Skip()
  552. }
  553. if iter.nextToken() != ',' {
  554. break
  555. }
  556. }
  557. if iter.Error != nil && iter.Error != io.EOF {
  558. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  559. }
  560. }
  561. type threeFieldsStructDecoder struct {
  562. typ reflect.Type
  563. fieldHash1 int32
  564. fieldDecoder1 *structFieldDecoder
  565. fieldHash2 int32
  566. fieldDecoder2 *structFieldDecoder
  567. fieldHash3 int32
  568. fieldDecoder3 *structFieldDecoder
  569. }
  570. func (decoder *threeFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  571. if !iter.readObjectStart() {
  572. return
  573. }
  574. for {
  575. switch iter.readFieldHash() {
  576. case decoder.fieldHash1:
  577. decoder.fieldDecoder1.Decode(ptr, iter)
  578. case decoder.fieldHash2:
  579. decoder.fieldDecoder2.Decode(ptr, iter)
  580. case decoder.fieldHash3:
  581. decoder.fieldDecoder3.Decode(ptr, iter)
  582. default:
  583. iter.Skip()
  584. }
  585. if iter.nextToken() != ',' {
  586. break
  587. }
  588. }
  589. if iter.Error != nil && iter.Error != io.EOF {
  590. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  591. }
  592. }
  593. type fourFieldsStructDecoder struct {
  594. typ reflect.Type
  595. fieldHash1 int32
  596. fieldDecoder1 *structFieldDecoder
  597. fieldHash2 int32
  598. fieldDecoder2 *structFieldDecoder
  599. fieldHash3 int32
  600. fieldDecoder3 *structFieldDecoder
  601. fieldHash4 int32
  602. fieldDecoder4 *structFieldDecoder
  603. }
  604. func (decoder *fourFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  605. if !iter.readObjectStart() {
  606. return
  607. }
  608. for {
  609. switch iter.readFieldHash() {
  610. case decoder.fieldHash1:
  611. decoder.fieldDecoder1.Decode(ptr, iter)
  612. case decoder.fieldHash2:
  613. decoder.fieldDecoder2.Decode(ptr, iter)
  614. case decoder.fieldHash3:
  615. decoder.fieldDecoder3.Decode(ptr, iter)
  616. case decoder.fieldHash4:
  617. decoder.fieldDecoder4.Decode(ptr, iter)
  618. default:
  619. iter.Skip()
  620. }
  621. if iter.nextToken() != ',' {
  622. break
  623. }
  624. }
  625. if iter.Error != nil && iter.Error != io.EOF {
  626. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  627. }
  628. }
  629. type fiveFieldsStructDecoder struct {
  630. typ reflect.Type
  631. fieldHash1 int32
  632. fieldDecoder1 *structFieldDecoder
  633. fieldHash2 int32
  634. fieldDecoder2 *structFieldDecoder
  635. fieldHash3 int32
  636. fieldDecoder3 *structFieldDecoder
  637. fieldHash4 int32
  638. fieldDecoder4 *structFieldDecoder
  639. fieldHash5 int32
  640. fieldDecoder5 *structFieldDecoder
  641. }
  642. func (decoder *fiveFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  643. if !iter.readObjectStart() {
  644. return
  645. }
  646. for {
  647. switch iter.readFieldHash() {
  648. case decoder.fieldHash1:
  649. decoder.fieldDecoder1.Decode(ptr, iter)
  650. case decoder.fieldHash2:
  651. decoder.fieldDecoder2.Decode(ptr, iter)
  652. case decoder.fieldHash3:
  653. decoder.fieldDecoder3.Decode(ptr, iter)
  654. case decoder.fieldHash4:
  655. decoder.fieldDecoder4.Decode(ptr, iter)
  656. case decoder.fieldHash5:
  657. decoder.fieldDecoder5.Decode(ptr, iter)
  658. default:
  659. iter.Skip()
  660. }
  661. if iter.nextToken() != ',' {
  662. break
  663. }
  664. }
  665. if iter.Error != nil && iter.Error != io.EOF {
  666. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  667. }
  668. }
  669. type sixFieldsStructDecoder struct {
  670. typ reflect.Type
  671. fieldHash1 int32
  672. fieldDecoder1 *structFieldDecoder
  673. fieldHash2 int32
  674. fieldDecoder2 *structFieldDecoder
  675. fieldHash3 int32
  676. fieldDecoder3 *structFieldDecoder
  677. fieldHash4 int32
  678. fieldDecoder4 *structFieldDecoder
  679. fieldHash5 int32
  680. fieldDecoder5 *structFieldDecoder
  681. fieldHash6 int32
  682. fieldDecoder6 *structFieldDecoder
  683. }
  684. func (decoder *sixFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  685. if !iter.readObjectStart() {
  686. return
  687. }
  688. for {
  689. switch iter.readFieldHash() {
  690. case decoder.fieldHash1:
  691. decoder.fieldDecoder1.Decode(ptr, iter)
  692. case decoder.fieldHash2:
  693. decoder.fieldDecoder2.Decode(ptr, iter)
  694. case decoder.fieldHash3:
  695. decoder.fieldDecoder3.Decode(ptr, iter)
  696. case decoder.fieldHash4:
  697. decoder.fieldDecoder4.Decode(ptr, iter)
  698. case decoder.fieldHash5:
  699. decoder.fieldDecoder5.Decode(ptr, iter)
  700. case decoder.fieldHash6:
  701. decoder.fieldDecoder6.Decode(ptr, iter)
  702. default:
  703. iter.Skip()
  704. }
  705. if iter.nextToken() != ',' {
  706. break
  707. }
  708. }
  709. if iter.Error != nil && iter.Error != io.EOF {
  710. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  711. }
  712. }
  713. type sevenFieldsStructDecoder struct {
  714. typ reflect.Type
  715. fieldHash1 int32
  716. fieldDecoder1 *structFieldDecoder
  717. fieldHash2 int32
  718. fieldDecoder2 *structFieldDecoder
  719. fieldHash3 int32
  720. fieldDecoder3 *structFieldDecoder
  721. fieldHash4 int32
  722. fieldDecoder4 *structFieldDecoder
  723. fieldHash5 int32
  724. fieldDecoder5 *structFieldDecoder
  725. fieldHash6 int32
  726. fieldDecoder6 *structFieldDecoder
  727. fieldHash7 int32
  728. fieldDecoder7 *structFieldDecoder
  729. }
  730. func (decoder *sevenFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  731. if !iter.readObjectStart() {
  732. return
  733. }
  734. for {
  735. switch iter.readFieldHash() {
  736. case decoder.fieldHash1:
  737. decoder.fieldDecoder1.Decode(ptr, iter)
  738. case decoder.fieldHash2:
  739. decoder.fieldDecoder2.Decode(ptr, iter)
  740. case decoder.fieldHash3:
  741. decoder.fieldDecoder3.Decode(ptr, iter)
  742. case decoder.fieldHash4:
  743. decoder.fieldDecoder4.Decode(ptr, iter)
  744. case decoder.fieldHash5:
  745. decoder.fieldDecoder5.Decode(ptr, iter)
  746. case decoder.fieldHash6:
  747. decoder.fieldDecoder6.Decode(ptr, iter)
  748. case decoder.fieldHash7:
  749. decoder.fieldDecoder7.Decode(ptr, iter)
  750. default:
  751. iter.Skip()
  752. }
  753. if iter.nextToken() != ',' {
  754. break
  755. }
  756. }
  757. if iter.Error != nil && iter.Error != io.EOF {
  758. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  759. }
  760. }
  761. type eightFieldsStructDecoder struct {
  762. typ reflect.Type
  763. fieldHash1 int32
  764. fieldDecoder1 *structFieldDecoder
  765. fieldHash2 int32
  766. fieldDecoder2 *structFieldDecoder
  767. fieldHash3 int32
  768. fieldDecoder3 *structFieldDecoder
  769. fieldHash4 int32
  770. fieldDecoder4 *structFieldDecoder
  771. fieldHash5 int32
  772. fieldDecoder5 *structFieldDecoder
  773. fieldHash6 int32
  774. fieldDecoder6 *structFieldDecoder
  775. fieldHash7 int32
  776. fieldDecoder7 *structFieldDecoder
  777. fieldHash8 int32
  778. fieldDecoder8 *structFieldDecoder
  779. }
  780. func (decoder *eightFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  781. if !iter.readObjectStart() {
  782. return
  783. }
  784. for {
  785. switch iter.readFieldHash() {
  786. case decoder.fieldHash1:
  787. decoder.fieldDecoder1.Decode(ptr, iter)
  788. case decoder.fieldHash2:
  789. decoder.fieldDecoder2.Decode(ptr, iter)
  790. case decoder.fieldHash3:
  791. decoder.fieldDecoder3.Decode(ptr, iter)
  792. case decoder.fieldHash4:
  793. decoder.fieldDecoder4.Decode(ptr, iter)
  794. case decoder.fieldHash5:
  795. decoder.fieldDecoder5.Decode(ptr, iter)
  796. case decoder.fieldHash6:
  797. decoder.fieldDecoder6.Decode(ptr, iter)
  798. case decoder.fieldHash7:
  799. decoder.fieldDecoder7.Decode(ptr, iter)
  800. case decoder.fieldHash8:
  801. decoder.fieldDecoder8.Decode(ptr, iter)
  802. default:
  803. iter.Skip()
  804. }
  805. if iter.nextToken() != ',' {
  806. break
  807. }
  808. }
  809. if iter.Error != nil && iter.Error != io.EOF {
  810. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  811. }
  812. }
  813. type nineFieldsStructDecoder struct {
  814. typ reflect.Type
  815. fieldHash1 int32
  816. fieldDecoder1 *structFieldDecoder
  817. fieldHash2 int32
  818. fieldDecoder2 *structFieldDecoder
  819. fieldHash3 int32
  820. fieldDecoder3 *structFieldDecoder
  821. fieldHash4 int32
  822. fieldDecoder4 *structFieldDecoder
  823. fieldHash5 int32
  824. fieldDecoder5 *structFieldDecoder
  825. fieldHash6 int32
  826. fieldDecoder6 *structFieldDecoder
  827. fieldHash7 int32
  828. fieldDecoder7 *structFieldDecoder
  829. fieldHash8 int32
  830. fieldDecoder8 *structFieldDecoder
  831. fieldHash9 int32
  832. fieldDecoder9 *structFieldDecoder
  833. }
  834. func (decoder *nineFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  835. if !iter.readObjectStart() {
  836. return
  837. }
  838. for {
  839. switch iter.readFieldHash() {
  840. case decoder.fieldHash1:
  841. decoder.fieldDecoder1.Decode(ptr, iter)
  842. case decoder.fieldHash2:
  843. decoder.fieldDecoder2.Decode(ptr, iter)
  844. case decoder.fieldHash3:
  845. decoder.fieldDecoder3.Decode(ptr, iter)
  846. case decoder.fieldHash4:
  847. decoder.fieldDecoder4.Decode(ptr, iter)
  848. case decoder.fieldHash5:
  849. decoder.fieldDecoder5.Decode(ptr, iter)
  850. case decoder.fieldHash6:
  851. decoder.fieldDecoder6.Decode(ptr, iter)
  852. case decoder.fieldHash7:
  853. decoder.fieldDecoder7.Decode(ptr, iter)
  854. case decoder.fieldHash8:
  855. decoder.fieldDecoder8.Decode(ptr, iter)
  856. case decoder.fieldHash9:
  857. decoder.fieldDecoder9.Decode(ptr, iter)
  858. default:
  859. iter.Skip()
  860. }
  861. if iter.nextToken() != ',' {
  862. break
  863. }
  864. }
  865. if iter.Error != nil && iter.Error != io.EOF {
  866. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  867. }
  868. }
  869. type tenFieldsStructDecoder struct {
  870. typ reflect.Type
  871. fieldHash1 int32
  872. fieldDecoder1 *structFieldDecoder
  873. fieldHash2 int32
  874. fieldDecoder2 *structFieldDecoder
  875. fieldHash3 int32
  876. fieldDecoder3 *structFieldDecoder
  877. fieldHash4 int32
  878. fieldDecoder4 *structFieldDecoder
  879. fieldHash5 int32
  880. fieldDecoder5 *structFieldDecoder
  881. fieldHash6 int32
  882. fieldDecoder6 *structFieldDecoder
  883. fieldHash7 int32
  884. fieldDecoder7 *structFieldDecoder
  885. fieldHash8 int32
  886. fieldDecoder8 *structFieldDecoder
  887. fieldHash9 int32
  888. fieldDecoder9 *structFieldDecoder
  889. fieldHash10 int32
  890. fieldDecoder10 *structFieldDecoder
  891. }
  892. func (decoder *tenFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  893. if !iter.readObjectStart() {
  894. return
  895. }
  896. for {
  897. switch iter.readFieldHash() {
  898. case decoder.fieldHash1:
  899. decoder.fieldDecoder1.Decode(ptr, iter)
  900. case decoder.fieldHash2:
  901. decoder.fieldDecoder2.Decode(ptr, iter)
  902. case decoder.fieldHash3:
  903. decoder.fieldDecoder3.Decode(ptr, iter)
  904. case decoder.fieldHash4:
  905. decoder.fieldDecoder4.Decode(ptr, iter)
  906. case decoder.fieldHash5:
  907. decoder.fieldDecoder5.Decode(ptr, iter)
  908. case decoder.fieldHash6:
  909. decoder.fieldDecoder6.Decode(ptr, iter)
  910. case decoder.fieldHash7:
  911. decoder.fieldDecoder7.Decode(ptr, iter)
  912. case decoder.fieldHash8:
  913. decoder.fieldDecoder8.Decode(ptr, iter)
  914. case decoder.fieldHash9:
  915. decoder.fieldDecoder9.Decode(ptr, iter)
  916. case decoder.fieldHash10:
  917. decoder.fieldDecoder10.Decode(ptr, iter)
  918. default:
  919. iter.Skip()
  920. }
  921. if iter.nextToken() != ',' {
  922. break
  923. }
  924. }
  925. if iter.Error != nil && iter.Error != io.EOF {
  926. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  927. }
  928. }
  929. type structFieldDecoder struct {
  930. field *reflect.StructField
  931. fieldDecoder ValDecoder
  932. }
  933. func (decoder *structFieldDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  934. fieldPtr := uintptr(ptr) + decoder.field.Offset
  935. decoder.fieldDecoder.Decode(unsafe.Pointer(fieldPtr), iter)
  936. if iter.Error != nil && iter.Error != io.EOF {
  937. iter.Error = fmt.Errorf("%s: %s", decoder.field.Name, iter.Error.Error())
  938. }
  939. }
  940. type structFieldEncoder struct {
  941. field *reflect.StructField
  942. fieldEncoder ValEncoder
  943. omitempty bool
  944. }
  945. func (encoder *structFieldEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
  946. fieldPtr := uintptr(ptr) + encoder.field.Offset
  947. encoder.fieldEncoder.Encode(unsafe.Pointer(fieldPtr), stream)
  948. if stream.Error != nil && stream.Error != io.EOF {
  949. stream.Error = fmt.Errorf("%s: %s", encoder.field.Name, stream.Error.Error())
  950. }
  951. }
  952. func (encoder *structFieldEncoder) EncodeInterface(val interface{}, stream *Stream) {
  953. WriteToStream(val, stream, encoder)
  954. }
  955. func (encoder *structFieldEncoder) IsEmpty(ptr unsafe.Pointer) bool {
  956. fieldPtr := uintptr(ptr) + encoder.field.Offset
  957. return encoder.fieldEncoder.IsEmpty(unsafe.Pointer(fieldPtr))
  958. }
  959. type structEncoder struct {
  960. fields []structFieldTo
  961. }
  962. type structFieldTo struct {
  963. encoder *structFieldEncoder
  964. toName string
  965. }
  966. func (encoder *structEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
  967. stream.WriteObjectStart()
  968. isNotFirst := false
  969. for _, field := range encoder.fields {
  970. if field.encoder.omitempty && field.encoder.IsEmpty(ptr) {
  971. continue
  972. }
  973. if isNotFirst {
  974. stream.WriteMore()
  975. }
  976. stream.WriteObjectField(field.toName)
  977. field.encoder.Encode(ptr, stream)
  978. isNotFirst = true
  979. }
  980. stream.WriteObjectEnd()
  981. }
  982. func (encoder *structEncoder) EncodeInterface(val interface{}, stream *Stream) {
  983. var encoderToUse ValEncoder
  984. encoderToUse = encoder
  985. if len(encoder.fields) == 1 {
  986. firstFieldName := encoder.fields[0].toName
  987. firstField := encoder.fields[0].encoder
  988. firstEncoder := firstField.fieldEncoder
  989. firstEncoderName := reflect.TypeOf(firstEncoder).String()
  990. // interface{} has inline optimization for this case
  991. if firstEncoderName == "*jsoniter.optionalEncoder" {
  992. encoderToUse = &structEncoder{
  993. fields: []structFieldTo{
  994. {
  995. toName: firstFieldName,
  996. encoder: &structFieldEncoder{
  997. field: firstField.field,
  998. fieldEncoder: firstEncoder.(*optionalEncoder).valueEncoder,
  999. omitempty: firstField.omitempty,
  1000. },
  1001. },
  1002. },
  1003. }
  1004. e := (*emptyInterface)(unsafe.Pointer(&val))
  1005. if e.word == nil {
  1006. stream.WriteObjectStart()
  1007. stream.WriteObjectField(firstFieldName)
  1008. stream.WriteNil()
  1009. stream.WriteObjectEnd()
  1010. return
  1011. }
  1012. if reflect.TypeOf(val).Kind() == reflect.Ptr {
  1013. encoderToUse.Encode(unsafe.Pointer(&e.word), stream)
  1014. } else {
  1015. encoderToUse.Encode(e.word, stream)
  1016. }
  1017. return
  1018. }
  1019. }
  1020. WriteToStream(val, stream, encoderToUse)
  1021. }
  1022. func (encoder *structEncoder) IsEmpty(ptr unsafe.Pointer) bool {
  1023. for _, field := range encoder.fields {
  1024. if !field.encoder.IsEmpty(ptr) {
  1025. return false
  1026. }
  1027. }
  1028. return true
  1029. }
  1030. type emptyStructEncoder struct {
  1031. }
  1032. func (encoder *emptyStructEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
  1033. stream.WriteEmptyObject()
  1034. }
  1035. func (encoder *emptyStructEncoder) EncodeInterface(val interface{}, stream *Stream) {
  1036. WriteToStream(val, stream, encoder)
  1037. }
  1038. func (encoder *emptyStructEncoder) IsEmpty(ptr unsafe.Pointer) bool {
  1039. return true
  1040. }