feature_reflect_struct_decoder.go 25 KB

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