feature_reflect_struct_decoder.go 26 KB

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