feature_reflect_struct_decoder.go 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916
  1. package jsoniter
  2. import (
  3. "fmt"
  4. "io"
  5. "reflect"
  6. "strings"
  7. "unsafe"
  8. )
  9. func createStructDecoder(typ reflect.Type, fields map[string]*structFieldDecoder) (ValDecoder, error) {
  10. knownHash := map[int32]struct{}{
  11. 0: {},
  12. }
  13. switch len(fields) {
  14. case 0:
  15. return &skipObjectDecoder{typ}, nil
  16. case 1:
  17. for fieldName, fieldDecoder := range fields {
  18. fieldHash := calcHash(fieldName)
  19. _, known := knownHash[fieldHash]
  20. if known {
  21. return &generalStructDecoder{typ, fields}, nil
  22. }
  23. knownHash[fieldHash] = struct{}{}
  24. return &oneFieldStructDecoder{typ, fieldHash, fieldDecoder}, nil
  25. }
  26. case 2:
  27. var fieldHash1 int32
  28. var fieldHash2 int32
  29. var fieldDecoder1 *structFieldDecoder
  30. var fieldDecoder2 *structFieldDecoder
  31. for fieldName, fieldDecoder := range fields {
  32. fieldHash := calcHash(fieldName)
  33. _, known := knownHash[fieldHash]
  34. if known {
  35. return &generalStructDecoder{typ, fields}, nil
  36. }
  37. knownHash[fieldHash] = struct{}{}
  38. if fieldHash1 == 0 {
  39. fieldHash1 = fieldHash
  40. fieldDecoder1 = fieldDecoder
  41. } else {
  42. fieldHash2 = fieldHash
  43. fieldDecoder2 = fieldDecoder
  44. }
  45. }
  46. return &twoFieldsStructDecoder{typ, fieldHash1, fieldDecoder1, fieldHash2, fieldDecoder2}, nil
  47. case 3:
  48. var fieldName1 int32
  49. var fieldName2 int32
  50. var fieldName3 int32
  51. var fieldDecoder1 *structFieldDecoder
  52. var fieldDecoder2 *structFieldDecoder
  53. var fieldDecoder3 *structFieldDecoder
  54. for fieldName, fieldDecoder := range fields {
  55. fieldHash := calcHash(fieldName)
  56. _, known := knownHash[fieldHash]
  57. if known {
  58. return &generalStructDecoder{typ, fields}, nil
  59. }
  60. knownHash[fieldHash] = struct{}{}
  61. if fieldName1 == 0 {
  62. fieldName1 = fieldHash
  63. fieldDecoder1 = fieldDecoder
  64. } else if fieldName2 == 0 {
  65. fieldName2 = fieldHash
  66. fieldDecoder2 = fieldDecoder
  67. } else {
  68. fieldName3 = fieldHash
  69. fieldDecoder3 = fieldDecoder
  70. }
  71. }
  72. return &threeFieldsStructDecoder{typ,
  73. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3}, nil
  74. case 4:
  75. var fieldName1 int32
  76. var fieldName2 int32
  77. var fieldName3 int32
  78. var fieldName4 int32
  79. var fieldDecoder1 *structFieldDecoder
  80. var fieldDecoder2 *structFieldDecoder
  81. var fieldDecoder3 *structFieldDecoder
  82. var fieldDecoder4 *structFieldDecoder
  83. for fieldName, fieldDecoder := range fields {
  84. fieldHash := calcHash(fieldName)
  85. _, known := knownHash[fieldHash]
  86. if known {
  87. return &generalStructDecoder{typ, fields}, nil
  88. }
  89. knownHash[fieldHash] = struct{}{}
  90. if fieldName1 == 0 {
  91. fieldName1 = fieldHash
  92. fieldDecoder1 = fieldDecoder
  93. } else if fieldName2 == 0 {
  94. fieldName2 = fieldHash
  95. fieldDecoder2 = fieldDecoder
  96. } else if fieldName3 == 0 {
  97. fieldName3 = fieldHash
  98. fieldDecoder3 = fieldDecoder
  99. } else {
  100. fieldName4 = fieldHash
  101. fieldDecoder4 = fieldDecoder
  102. }
  103. }
  104. return &fourFieldsStructDecoder{typ,
  105. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
  106. fieldName4, fieldDecoder4}, nil
  107. case 5:
  108. var fieldName1 int32
  109. var fieldName2 int32
  110. var fieldName3 int32
  111. var fieldName4 int32
  112. var fieldName5 int32
  113. var fieldDecoder1 *structFieldDecoder
  114. var fieldDecoder2 *structFieldDecoder
  115. var fieldDecoder3 *structFieldDecoder
  116. var fieldDecoder4 *structFieldDecoder
  117. var fieldDecoder5 *structFieldDecoder
  118. for fieldName, fieldDecoder := range fields {
  119. fieldHash := calcHash(fieldName)
  120. _, known := knownHash[fieldHash]
  121. if known {
  122. return &generalStructDecoder{typ, fields}, nil
  123. }
  124. knownHash[fieldHash] = struct{}{}
  125. if fieldName1 == 0 {
  126. fieldName1 = fieldHash
  127. fieldDecoder1 = fieldDecoder
  128. } else if fieldName2 == 0 {
  129. fieldName2 = fieldHash
  130. fieldDecoder2 = fieldDecoder
  131. } else if fieldName3 == 0 {
  132. fieldName3 = fieldHash
  133. fieldDecoder3 = fieldDecoder
  134. } else if fieldName4 == 0 {
  135. fieldName4 = fieldHash
  136. fieldDecoder4 = fieldDecoder
  137. } else {
  138. fieldName5 = fieldHash
  139. fieldDecoder5 = fieldDecoder
  140. }
  141. }
  142. return &fiveFieldsStructDecoder{typ,
  143. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
  144. fieldName4, fieldDecoder4, fieldName5, fieldDecoder5}, nil
  145. case 6:
  146. var fieldName1 int32
  147. var fieldName2 int32
  148. var fieldName3 int32
  149. var fieldName4 int32
  150. var fieldName5 int32
  151. var fieldName6 int32
  152. var fieldDecoder1 *structFieldDecoder
  153. var fieldDecoder2 *structFieldDecoder
  154. var fieldDecoder3 *structFieldDecoder
  155. var fieldDecoder4 *structFieldDecoder
  156. var fieldDecoder5 *structFieldDecoder
  157. var fieldDecoder6 *structFieldDecoder
  158. for fieldName, fieldDecoder := range fields {
  159. fieldHash := calcHash(fieldName)
  160. _, known := knownHash[fieldHash]
  161. if known {
  162. return &generalStructDecoder{typ, fields}, nil
  163. }
  164. knownHash[fieldHash] = struct{}{}
  165. if fieldName1 == 0 {
  166. fieldName1 = fieldHash
  167. fieldDecoder1 = fieldDecoder
  168. } else if fieldName2 == 0 {
  169. fieldName2 = fieldHash
  170. fieldDecoder2 = fieldDecoder
  171. } else if fieldName3 == 0 {
  172. fieldName3 = fieldHash
  173. fieldDecoder3 = fieldDecoder
  174. } else if fieldName4 == 0 {
  175. fieldName4 = fieldHash
  176. fieldDecoder4 = fieldDecoder
  177. } else if fieldName5 == 0 {
  178. fieldName5 = fieldHash
  179. fieldDecoder5 = fieldDecoder
  180. } else {
  181. fieldName6 = fieldHash
  182. fieldDecoder6 = fieldDecoder
  183. }
  184. }
  185. return &sixFieldsStructDecoder{typ,
  186. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
  187. fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6}, nil
  188. case 7:
  189. var fieldName1 int32
  190. var fieldName2 int32
  191. var fieldName3 int32
  192. var fieldName4 int32
  193. var fieldName5 int32
  194. var fieldName6 int32
  195. var fieldName7 int32
  196. var fieldDecoder1 *structFieldDecoder
  197. var fieldDecoder2 *structFieldDecoder
  198. var fieldDecoder3 *structFieldDecoder
  199. var fieldDecoder4 *structFieldDecoder
  200. var fieldDecoder5 *structFieldDecoder
  201. var fieldDecoder6 *structFieldDecoder
  202. var fieldDecoder7 *structFieldDecoder
  203. for fieldName, fieldDecoder := range fields {
  204. fieldHash := calcHash(fieldName)
  205. _, known := knownHash[fieldHash]
  206. if known {
  207. return &generalStructDecoder{typ, fields}, nil
  208. }
  209. knownHash[fieldHash] = struct{}{}
  210. if fieldName1 == 0 {
  211. fieldName1 = fieldHash
  212. fieldDecoder1 = fieldDecoder
  213. } else if fieldName2 == 0 {
  214. fieldName2 = fieldHash
  215. fieldDecoder2 = fieldDecoder
  216. } else if fieldName3 == 0 {
  217. fieldName3 = fieldHash
  218. fieldDecoder3 = fieldDecoder
  219. } else if fieldName4 == 0 {
  220. fieldName4 = fieldHash
  221. fieldDecoder4 = fieldDecoder
  222. } else if fieldName5 == 0 {
  223. fieldName5 = fieldHash
  224. fieldDecoder5 = fieldDecoder
  225. } else if fieldName6 == 0 {
  226. fieldName6 = fieldHash
  227. fieldDecoder6 = fieldDecoder
  228. } else {
  229. fieldName7 = fieldHash
  230. fieldDecoder7 = fieldDecoder
  231. }
  232. }
  233. return &sevenFieldsStructDecoder{typ,
  234. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
  235. fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6,
  236. fieldName7, fieldDecoder7}, nil
  237. case 8:
  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 fieldName8 int32
  246. var fieldDecoder1 *structFieldDecoder
  247. var fieldDecoder2 *structFieldDecoder
  248. var fieldDecoder3 *structFieldDecoder
  249. var fieldDecoder4 *structFieldDecoder
  250. var fieldDecoder5 *structFieldDecoder
  251. var fieldDecoder6 *structFieldDecoder
  252. var fieldDecoder7 *structFieldDecoder
  253. var fieldDecoder8 *structFieldDecoder
  254. for fieldName, fieldDecoder := range fields {
  255. fieldHash := calcHash(fieldName)
  256. _, known := knownHash[fieldHash]
  257. if known {
  258. return &generalStructDecoder{typ, fields}, nil
  259. }
  260. knownHash[fieldHash] = struct{}{}
  261. if fieldName1 == 0 {
  262. fieldName1 = fieldHash
  263. fieldDecoder1 = fieldDecoder
  264. } else if fieldName2 == 0 {
  265. fieldName2 = fieldHash
  266. fieldDecoder2 = fieldDecoder
  267. } else if fieldName3 == 0 {
  268. fieldName3 = fieldHash
  269. fieldDecoder3 = fieldDecoder
  270. } else if fieldName4 == 0 {
  271. fieldName4 = fieldHash
  272. fieldDecoder4 = fieldDecoder
  273. } else if fieldName5 == 0 {
  274. fieldName5 = fieldHash
  275. fieldDecoder5 = fieldDecoder
  276. } else if fieldName6 == 0 {
  277. fieldName6 = fieldHash
  278. fieldDecoder6 = fieldDecoder
  279. } else if fieldName7 == 0 {
  280. fieldName7 = fieldHash
  281. fieldDecoder7 = fieldDecoder
  282. } else {
  283. fieldName8 = fieldHash
  284. fieldDecoder8 = fieldDecoder
  285. }
  286. }
  287. return &eightFieldsStructDecoder{typ,
  288. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
  289. fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6,
  290. fieldName7, fieldDecoder7, fieldName8, fieldDecoder8}, nil
  291. case 9:
  292. var fieldName1 int32
  293. var fieldName2 int32
  294. var fieldName3 int32
  295. var fieldName4 int32
  296. var fieldName5 int32
  297. var fieldName6 int32
  298. var fieldName7 int32
  299. var fieldName8 int32
  300. var fieldName9 int32
  301. var fieldDecoder1 *structFieldDecoder
  302. var fieldDecoder2 *structFieldDecoder
  303. var fieldDecoder3 *structFieldDecoder
  304. var fieldDecoder4 *structFieldDecoder
  305. var fieldDecoder5 *structFieldDecoder
  306. var fieldDecoder6 *structFieldDecoder
  307. var fieldDecoder7 *structFieldDecoder
  308. var fieldDecoder8 *structFieldDecoder
  309. var fieldDecoder9 *structFieldDecoder
  310. for fieldName, fieldDecoder := range fields {
  311. fieldHash := calcHash(fieldName)
  312. _, known := knownHash[fieldHash]
  313. if known {
  314. return &generalStructDecoder{typ, fields}, nil
  315. }
  316. knownHash[fieldHash] = struct{}{}
  317. if fieldName1 == 0 {
  318. fieldName1 = fieldHash
  319. fieldDecoder1 = fieldDecoder
  320. } else if fieldName2 == 0 {
  321. fieldName2 = fieldHash
  322. fieldDecoder2 = fieldDecoder
  323. } else if fieldName3 == 0 {
  324. fieldName3 = fieldHash
  325. fieldDecoder3 = fieldDecoder
  326. } else if fieldName4 == 0 {
  327. fieldName4 = fieldHash
  328. fieldDecoder4 = fieldDecoder
  329. } else if fieldName5 == 0 {
  330. fieldName5 = fieldHash
  331. fieldDecoder5 = fieldDecoder
  332. } else if fieldName6 == 0 {
  333. fieldName6 = fieldHash
  334. fieldDecoder6 = fieldDecoder
  335. } else if fieldName7 == 0 {
  336. fieldName7 = fieldHash
  337. fieldDecoder7 = fieldDecoder
  338. } else if fieldName8 == 0 {
  339. fieldName8 = fieldHash
  340. fieldDecoder8 = fieldDecoder
  341. } else {
  342. fieldName9 = fieldHash
  343. fieldDecoder9 = fieldDecoder
  344. }
  345. }
  346. return &nineFieldsStructDecoder{typ,
  347. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
  348. fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6,
  349. fieldName7, fieldDecoder7, fieldName8, fieldDecoder8, fieldName9, fieldDecoder9}, nil
  350. case 10:
  351. var fieldName1 int32
  352. var fieldName2 int32
  353. var fieldName3 int32
  354. var fieldName4 int32
  355. var fieldName5 int32
  356. var fieldName6 int32
  357. var fieldName7 int32
  358. var fieldName8 int32
  359. var fieldName9 int32
  360. var fieldName10 int32
  361. var fieldDecoder1 *structFieldDecoder
  362. var fieldDecoder2 *structFieldDecoder
  363. var fieldDecoder3 *structFieldDecoder
  364. var fieldDecoder4 *structFieldDecoder
  365. var fieldDecoder5 *structFieldDecoder
  366. var fieldDecoder6 *structFieldDecoder
  367. var fieldDecoder7 *structFieldDecoder
  368. var fieldDecoder8 *structFieldDecoder
  369. var fieldDecoder9 *structFieldDecoder
  370. var fieldDecoder10 *structFieldDecoder
  371. for fieldName, fieldDecoder := range fields {
  372. fieldHash := calcHash(fieldName)
  373. _, known := knownHash[fieldHash]
  374. if known {
  375. return &generalStructDecoder{typ, fields}, nil
  376. }
  377. knownHash[fieldHash] = struct{}{}
  378. if fieldName1 == 0 {
  379. fieldName1 = fieldHash
  380. fieldDecoder1 = fieldDecoder
  381. } else if fieldName2 == 0 {
  382. fieldName2 = fieldHash
  383. fieldDecoder2 = fieldDecoder
  384. } else if fieldName3 == 0 {
  385. fieldName3 = fieldHash
  386. fieldDecoder3 = fieldDecoder
  387. } else if fieldName4 == 0 {
  388. fieldName4 = fieldHash
  389. fieldDecoder4 = fieldDecoder
  390. } else if fieldName5 == 0 {
  391. fieldName5 = fieldHash
  392. fieldDecoder5 = fieldDecoder
  393. } else if fieldName6 == 0 {
  394. fieldName6 = fieldHash
  395. fieldDecoder6 = fieldDecoder
  396. } else if fieldName7 == 0 {
  397. fieldName7 = fieldHash
  398. fieldDecoder7 = fieldDecoder
  399. } else if fieldName8 == 0 {
  400. fieldName8 = fieldHash
  401. fieldDecoder8 = fieldDecoder
  402. } else if fieldName9 == 0 {
  403. fieldName9 = fieldHash
  404. fieldDecoder9 = fieldDecoder
  405. } else {
  406. fieldName10 = fieldHash
  407. fieldDecoder10 = fieldDecoder
  408. }
  409. }
  410. return &tenFieldsStructDecoder{typ,
  411. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
  412. fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6,
  413. fieldName7, fieldDecoder7, fieldName8, fieldDecoder8, fieldName9, fieldDecoder9,
  414. fieldName10, fieldDecoder10}, nil
  415. }
  416. return &generalStructDecoder{typ, fields}, nil
  417. }
  418. type generalStructDecoder struct {
  419. typ reflect.Type
  420. fields map[string]*structFieldDecoder
  421. }
  422. func (decoder *generalStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  423. if !iter.readObjectStart() {
  424. return
  425. }
  426. fieldBytes := iter.readObjectFieldAsBytes()
  427. field := *(*string)(unsafe.Pointer(&fieldBytes))
  428. fieldDecoder := decoder.fields[strings.ToLower(field)]
  429. if fieldDecoder == nil {
  430. iter.Skip()
  431. } else {
  432. fieldDecoder.Decode(ptr, iter)
  433. }
  434. for iter.nextToken() == ',' {
  435. fieldBytes = iter.readObjectFieldAsBytes()
  436. field = *(*string)(unsafe.Pointer(&fieldBytes))
  437. fieldDecoder = decoder.fields[strings.ToLower(field)]
  438. if fieldDecoder == nil {
  439. iter.Skip()
  440. } else {
  441. fieldDecoder.Decode(ptr, iter)
  442. }
  443. }
  444. if iter.Error != nil && iter.Error != io.EOF {
  445. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  446. }
  447. }
  448. type skipObjectDecoder struct {
  449. typ reflect.Type
  450. }
  451. func (decoder *skipObjectDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  452. valueType := iter.WhatIsNext()
  453. if valueType != ObjectValue && valueType != NilValue {
  454. iter.ReportError("skipObjectDecoder", "expect object or null")
  455. return
  456. }
  457. iter.Skip()
  458. }
  459. type oneFieldStructDecoder struct {
  460. typ reflect.Type
  461. fieldHash int32
  462. fieldDecoder *structFieldDecoder
  463. }
  464. func (decoder *oneFieldStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  465. if !iter.readObjectStart() {
  466. return
  467. }
  468. for {
  469. if iter.readFieldHash() == decoder.fieldHash {
  470. decoder.fieldDecoder.Decode(ptr, iter)
  471. } else {
  472. iter.Skip()
  473. }
  474. if iter.isObjectEnd() {
  475. break
  476. }
  477. }
  478. if iter.Error != nil && iter.Error != io.EOF {
  479. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  480. }
  481. }
  482. type twoFieldsStructDecoder struct {
  483. typ reflect.Type
  484. fieldHash1 int32
  485. fieldDecoder1 *structFieldDecoder
  486. fieldHash2 int32
  487. fieldDecoder2 *structFieldDecoder
  488. }
  489. func (decoder *twoFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  490. if !iter.readObjectStart() {
  491. return
  492. }
  493. for {
  494. switch iter.readFieldHash() {
  495. case decoder.fieldHash1:
  496. decoder.fieldDecoder1.Decode(ptr, iter)
  497. case decoder.fieldHash2:
  498. decoder.fieldDecoder2.Decode(ptr, iter)
  499. default:
  500. iter.Skip()
  501. }
  502. if iter.isObjectEnd() {
  503. break
  504. }
  505. }
  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 threeFieldsStructDecoder struct {
  511. typ reflect.Type
  512. fieldHash1 int32
  513. fieldDecoder1 *structFieldDecoder
  514. fieldHash2 int32
  515. fieldDecoder2 *structFieldDecoder
  516. fieldHash3 int32
  517. fieldDecoder3 *structFieldDecoder
  518. }
  519. func (decoder *threeFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  520. if !iter.readObjectStart() {
  521. return
  522. }
  523. for {
  524. switch iter.readFieldHash() {
  525. case decoder.fieldHash1:
  526. decoder.fieldDecoder1.Decode(ptr, iter)
  527. case decoder.fieldHash2:
  528. decoder.fieldDecoder2.Decode(ptr, iter)
  529. case decoder.fieldHash3:
  530. decoder.fieldDecoder3.Decode(ptr, iter)
  531. default:
  532. iter.Skip()
  533. }
  534. if iter.isObjectEnd() {
  535. break
  536. }
  537. }
  538. if iter.Error != nil && iter.Error != io.EOF {
  539. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  540. }
  541. }
  542. type fourFieldsStructDecoder struct {
  543. typ reflect.Type
  544. fieldHash1 int32
  545. fieldDecoder1 *structFieldDecoder
  546. fieldHash2 int32
  547. fieldDecoder2 *structFieldDecoder
  548. fieldHash3 int32
  549. fieldDecoder3 *structFieldDecoder
  550. fieldHash4 int32
  551. fieldDecoder4 *structFieldDecoder
  552. }
  553. func (decoder *fourFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  554. if !iter.readObjectStart() {
  555. return
  556. }
  557. for {
  558. switch iter.readFieldHash() {
  559. case decoder.fieldHash1:
  560. decoder.fieldDecoder1.Decode(ptr, iter)
  561. case decoder.fieldHash2:
  562. decoder.fieldDecoder2.Decode(ptr, iter)
  563. case decoder.fieldHash3:
  564. decoder.fieldDecoder3.Decode(ptr, iter)
  565. case decoder.fieldHash4:
  566. decoder.fieldDecoder4.Decode(ptr, iter)
  567. default:
  568. iter.Skip()
  569. }
  570. if iter.isObjectEnd() {
  571. break
  572. }
  573. }
  574. if iter.Error != nil && iter.Error != io.EOF {
  575. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  576. }
  577. }
  578. type fiveFieldsStructDecoder struct {
  579. typ reflect.Type
  580. fieldHash1 int32
  581. fieldDecoder1 *structFieldDecoder
  582. fieldHash2 int32
  583. fieldDecoder2 *structFieldDecoder
  584. fieldHash3 int32
  585. fieldDecoder3 *structFieldDecoder
  586. fieldHash4 int32
  587. fieldDecoder4 *structFieldDecoder
  588. fieldHash5 int32
  589. fieldDecoder5 *structFieldDecoder
  590. }
  591. func (decoder *fiveFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  592. if !iter.readObjectStart() {
  593. return
  594. }
  595. for {
  596. switch iter.readFieldHash() {
  597. case decoder.fieldHash1:
  598. decoder.fieldDecoder1.Decode(ptr, iter)
  599. case decoder.fieldHash2:
  600. decoder.fieldDecoder2.Decode(ptr, iter)
  601. case decoder.fieldHash3:
  602. decoder.fieldDecoder3.Decode(ptr, iter)
  603. case decoder.fieldHash4:
  604. decoder.fieldDecoder4.Decode(ptr, iter)
  605. case decoder.fieldHash5:
  606. decoder.fieldDecoder5.Decode(ptr, iter)
  607. default:
  608. iter.Skip()
  609. }
  610. if iter.isObjectEnd() {
  611. break
  612. }
  613. }
  614. if iter.Error != nil && iter.Error != io.EOF {
  615. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  616. }
  617. }
  618. type sixFieldsStructDecoder struct {
  619. typ reflect.Type
  620. fieldHash1 int32
  621. fieldDecoder1 *structFieldDecoder
  622. fieldHash2 int32
  623. fieldDecoder2 *structFieldDecoder
  624. fieldHash3 int32
  625. fieldDecoder3 *structFieldDecoder
  626. fieldHash4 int32
  627. fieldDecoder4 *structFieldDecoder
  628. fieldHash5 int32
  629. fieldDecoder5 *structFieldDecoder
  630. fieldHash6 int32
  631. fieldDecoder6 *structFieldDecoder
  632. }
  633. func (decoder *sixFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  634. if !iter.readObjectStart() {
  635. return
  636. }
  637. for {
  638. switch iter.readFieldHash() {
  639. case decoder.fieldHash1:
  640. decoder.fieldDecoder1.Decode(ptr, iter)
  641. case decoder.fieldHash2:
  642. decoder.fieldDecoder2.Decode(ptr, iter)
  643. case decoder.fieldHash3:
  644. decoder.fieldDecoder3.Decode(ptr, iter)
  645. case decoder.fieldHash4:
  646. decoder.fieldDecoder4.Decode(ptr, iter)
  647. case decoder.fieldHash5:
  648. decoder.fieldDecoder5.Decode(ptr, iter)
  649. case decoder.fieldHash6:
  650. decoder.fieldDecoder6.Decode(ptr, iter)
  651. default:
  652. iter.Skip()
  653. }
  654. if iter.isObjectEnd() {
  655. break
  656. }
  657. }
  658. if iter.Error != nil && iter.Error != io.EOF {
  659. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  660. }
  661. }
  662. type sevenFieldsStructDecoder struct {
  663. typ reflect.Type
  664. fieldHash1 int32
  665. fieldDecoder1 *structFieldDecoder
  666. fieldHash2 int32
  667. fieldDecoder2 *structFieldDecoder
  668. fieldHash3 int32
  669. fieldDecoder3 *structFieldDecoder
  670. fieldHash4 int32
  671. fieldDecoder4 *structFieldDecoder
  672. fieldHash5 int32
  673. fieldDecoder5 *structFieldDecoder
  674. fieldHash6 int32
  675. fieldDecoder6 *structFieldDecoder
  676. fieldHash7 int32
  677. fieldDecoder7 *structFieldDecoder
  678. }
  679. func (decoder *sevenFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  680. if !iter.readObjectStart() {
  681. return
  682. }
  683. for {
  684. switch iter.readFieldHash() {
  685. case decoder.fieldHash1:
  686. decoder.fieldDecoder1.Decode(ptr, iter)
  687. case decoder.fieldHash2:
  688. decoder.fieldDecoder2.Decode(ptr, iter)
  689. case decoder.fieldHash3:
  690. decoder.fieldDecoder3.Decode(ptr, iter)
  691. case decoder.fieldHash4:
  692. decoder.fieldDecoder4.Decode(ptr, iter)
  693. case decoder.fieldHash5:
  694. decoder.fieldDecoder5.Decode(ptr, iter)
  695. case decoder.fieldHash6:
  696. decoder.fieldDecoder6.Decode(ptr, iter)
  697. case decoder.fieldHash7:
  698. decoder.fieldDecoder7.Decode(ptr, iter)
  699. default:
  700. iter.Skip()
  701. }
  702. if iter.isObjectEnd() {
  703. break
  704. }
  705. }
  706. if iter.Error != nil && iter.Error != io.EOF {
  707. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  708. }
  709. }
  710. type eightFieldsStructDecoder struct {
  711. typ reflect.Type
  712. fieldHash1 int32
  713. fieldDecoder1 *structFieldDecoder
  714. fieldHash2 int32
  715. fieldDecoder2 *structFieldDecoder
  716. fieldHash3 int32
  717. fieldDecoder3 *structFieldDecoder
  718. fieldHash4 int32
  719. fieldDecoder4 *structFieldDecoder
  720. fieldHash5 int32
  721. fieldDecoder5 *structFieldDecoder
  722. fieldHash6 int32
  723. fieldDecoder6 *structFieldDecoder
  724. fieldHash7 int32
  725. fieldDecoder7 *structFieldDecoder
  726. fieldHash8 int32
  727. fieldDecoder8 *structFieldDecoder
  728. }
  729. func (decoder *eightFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  730. if !iter.readObjectStart() {
  731. return
  732. }
  733. for {
  734. switch iter.readFieldHash() {
  735. case decoder.fieldHash1:
  736. decoder.fieldDecoder1.Decode(ptr, iter)
  737. case decoder.fieldHash2:
  738. decoder.fieldDecoder2.Decode(ptr, iter)
  739. case decoder.fieldHash3:
  740. decoder.fieldDecoder3.Decode(ptr, iter)
  741. case decoder.fieldHash4:
  742. decoder.fieldDecoder4.Decode(ptr, iter)
  743. case decoder.fieldHash5:
  744. decoder.fieldDecoder5.Decode(ptr, iter)
  745. case decoder.fieldHash6:
  746. decoder.fieldDecoder6.Decode(ptr, iter)
  747. case decoder.fieldHash7:
  748. decoder.fieldDecoder7.Decode(ptr, iter)
  749. case decoder.fieldHash8:
  750. decoder.fieldDecoder8.Decode(ptr, iter)
  751. default:
  752. iter.Skip()
  753. }
  754. if iter.isObjectEnd() {
  755. break
  756. }
  757. }
  758. if iter.Error != nil && iter.Error != io.EOF {
  759. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  760. }
  761. }
  762. type nineFieldsStructDecoder struct {
  763. typ reflect.Type
  764. fieldHash1 int32
  765. fieldDecoder1 *structFieldDecoder
  766. fieldHash2 int32
  767. fieldDecoder2 *structFieldDecoder
  768. fieldHash3 int32
  769. fieldDecoder3 *structFieldDecoder
  770. fieldHash4 int32
  771. fieldDecoder4 *structFieldDecoder
  772. fieldHash5 int32
  773. fieldDecoder5 *structFieldDecoder
  774. fieldHash6 int32
  775. fieldDecoder6 *structFieldDecoder
  776. fieldHash7 int32
  777. fieldDecoder7 *structFieldDecoder
  778. fieldHash8 int32
  779. fieldDecoder8 *structFieldDecoder
  780. fieldHash9 int32
  781. fieldDecoder9 *structFieldDecoder
  782. }
  783. func (decoder *nineFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  784. if !iter.readObjectStart() {
  785. return
  786. }
  787. for {
  788. switch iter.readFieldHash() {
  789. case decoder.fieldHash1:
  790. decoder.fieldDecoder1.Decode(ptr, iter)
  791. case decoder.fieldHash2:
  792. decoder.fieldDecoder2.Decode(ptr, iter)
  793. case decoder.fieldHash3:
  794. decoder.fieldDecoder3.Decode(ptr, iter)
  795. case decoder.fieldHash4:
  796. decoder.fieldDecoder4.Decode(ptr, iter)
  797. case decoder.fieldHash5:
  798. decoder.fieldDecoder5.Decode(ptr, iter)
  799. case decoder.fieldHash6:
  800. decoder.fieldDecoder6.Decode(ptr, iter)
  801. case decoder.fieldHash7:
  802. decoder.fieldDecoder7.Decode(ptr, iter)
  803. case decoder.fieldHash8:
  804. decoder.fieldDecoder8.Decode(ptr, iter)
  805. case decoder.fieldHash9:
  806. decoder.fieldDecoder9.Decode(ptr, iter)
  807. default:
  808. iter.Skip()
  809. }
  810. if iter.isObjectEnd() {
  811. break
  812. }
  813. }
  814. if iter.Error != nil && iter.Error != io.EOF {
  815. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  816. }
  817. }
  818. type tenFieldsStructDecoder struct {
  819. typ reflect.Type
  820. fieldHash1 int32
  821. fieldDecoder1 *structFieldDecoder
  822. fieldHash2 int32
  823. fieldDecoder2 *structFieldDecoder
  824. fieldHash3 int32
  825. fieldDecoder3 *structFieldDecoder
  826. fieldHash4 int32
  827. fieldDecoder4 *structFieldDecoder
  828. fieldHash5 int32
  829. fieldDecoder5 *structFieldDecoder
  830. fieldHash6 int32
  831. fieldDecoder6 *structFieldDecoder
  832. fieldHash7 int32
  833. fieldDecoder7 *structFieldDecoder
  834. fieldHash8 int32
  835. fieldDecoder8 *structFieldDecoder
  836. fieldHash9 int32
  837. fieldDecoder9 *structFieldDecoder
  838. fieldHash10 int32
  839. fieldDecoder10 *structFieldDecoder
  840. }
  841. func (decoder *tenFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  842. if !iter.readObjectStart() {
  843. return
  844. }
  845. for {
  846. switch iter.readFieldHash() {
  847. case decoder.fieldHash1:
  848. decoder.fieldDecoder1.Decode(ptr, iter)
  849. case decoder.fieldHash2:
  850. decoder.fieldDecoder2.Decode(ptr, iter)
  851. case decoder.fieldHash3:
  852. decoder.fieldDecoder3.Decode(ptr, iter)
  853. case decoder.fieldHash4:
  854. decoder.fieldDecoder4.Decode(ptr, iter)
  855. case decoder.fieldHash5:
  856. decoder.fieldDecoder5.Decode(ptr, iter)
  857. case decoder.fieldHash6:
  858. decoder.fieldDecoder6.Decode(ptr, iter)
  859. case decoder.fieldHash7:
  860. decoder.fieldDecoder7.Decode(ptr, iter)
  861. case decoder.fieldHash8:
  862. decoder.fieldDecoder8.Decode(ptr, iter)
  863. case decoder.fieldHash9:
  864. decoder.fieldDecoder9.Decode(ptr, iter)
  865. case decoder.fieldHash10:
  866. decoder.fieldDecoder10.Decode(ptr, iter)
  867. default:
  868. iter.Skip()
  869. }
  870. if iter.isObjectEnd() {
  871. break
  872. }
  873. }
  874. if iter.Error != nil && iter.Error != io.EOF {
  875. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  876. }
  877. }
  878. type structFieldDecoder struct {
  879. field *reflect.StructField
  880. fieldDecoder ValDecoder
  881. }
  882. func (decoder *structFieldDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  883. fieldPtr := unsafe.Pointer(uintptr(ptr) + decoder.field.Offset)
  884. decoder.fieldDecoder.Decode(fieldPtr, iter)
  885. if iter.Error != nil && iter.Error != io.EOF {
  886. iter.Error = fmt.Errorf("%s: %s", decoder.field.Name, iter.Error.Error())
  887. }
  888. }