feature_reflect_struct_decoder.go 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934
  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. var fieldBytes []byte
  427. var field string
  428. if iter.cfg.objectFieldMustBeSimpleString {
  429. fieldBytes = iter.readObjectFieldAsBytes()
  430. field = *(*string)(unsafe.Pointer(&fieldBytes))
  431. } else {
  432. field = iter.ReadString()
  433. c := iter.nextToken()
  434. if c != ':' {
  435. iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c}))
  436. }
  437. }
  438. fieldDecoder := decoder.fields[strings.ToLower(field)]
  439. if fieldDecoder == nil {
  440. iter.Skip()
  441. } else {
  442. fieldDecoder.Decode(ptr, iter)
  443. }
  444. for iter.nextToken() == ',' {
  445. if iter.cfg.objectFieldMustBeSimpleString {
  446. fieldBytes := iter.readObjectFieldAsBytes()
  447. field = *(*string)(unsafe.Pointer(&fieldBytes))
  448. } else {
  449. field = iter.ReadString()
  450. c := iter.nextToken()
  451. if c != ':' {
  452. iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c}))
  453. }
  454. }
  455. fieldDecoder = decoder.fields[strings.ToLower(field)]
  456. if fieldDecoder == nil {
  457. iter.Skip()
  458. } else {
  459. fieldDecoder.Decode(ptr, iter)
  460. }
  461. }
  462. if iter.Error != nil && iter.Error != io.EOF {
  463. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  464. }
  465. }
  466. type skipObjectDecoder struct {
  467. typ reflect.Type
  468. }
  469. func (decoder *skipObjectDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  470. valueType := iter.WhatIsNext()
  471. if valueType != ObjectValue && valueType != NilValue {
  472. iter.ReportError("skipObjectDecoder", "expect object or null")
  473. return
  474. }
  475. iter.Skip()
  476. }
  477. type oneFieldStructDecoder struct {
  478. typ reflect.Type
  479. fieldHash int32
  480. fieldDecoder *structFieldDecoder
  481. }
  482. func (decoder *oneFieldStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  483. if !iter.readObjectStart() {
  484. return
  485. }
  486. for {
  487. if iter.readFieldHash() == decoder.fieldHash {
  488. decoder.fieldDecoder.Decode(ptr, iter)
  489. } else {
  490. iter.Skip()
  491. }
  492. if iter.isObjectEnd() {
  493. break
  494. }
  495. }
  496. if iter.Error != nil && iter.Error != io.EOF {
  497. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  498. }
  499. }
  500. type twoFieldsStructDecoder struct {
  501. typ reflect.Type
  502. fieldHash1 int32
  503. fieldDecoder1 *structFieldDecoder
  504. fieldHash2 int32
  505. fieldDecoder2 *structFieldDecoder
  506. }
  507. func (decoder *twoFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  508. if !iter.readObjectStart() {
  509. return
  510. }
  511. for {
  512. switch iter.readFieldHash() {
  513. case decoder.fieldHash1:
  514. decoder.fieldDecoder1.Decode(ptr, iter)
  515. case decoder.fieldHash2:
  516. decoder.fieldDecoder2.Decode(ptr, iter)
  517. default:
  518. iter.Skip()
  519. }
  520. if iter.isObjectEnd() {
  521. break
  522. }
  523. }
  524. if iter.Error != nil && iter.Error != io.EOF {
  525. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  526. }
  527. }
  528. type threeFieldsStructDecoder struct {
  529. typ reflect.Type
  530. fieldHash1 int32
  531. fieldDecoder1 *structFieldDecoder
  532. fieldHash2 int32
  533. fieldDecoder2 *structFieldDecoder
  534. fieldHash3 int32
  535. fieldDecoder3 *structFieldDecoder
  536. }
  537. func (decoder *threeFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  538. if !iter.readObjectStart() {
  539. return
  540. }
  541. for {
  542. switch iter.readFieldHash() {
  543. case decoder.fieldHash1:
  544. decoder.fieldDecoder1.Decode(ptr, iter)
  545. case decoder.fieldHash2:
  546. decoder.fieldDecoder2.Decode(ptr, iter)
  547. case decoder.fieldHash3:
  548. decoder.fieldDecoder3.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 fourFieldsStructDecoder struct {
  561. typ reflect.Type
  562. fieldHash1 int32
  563. fieldDecoder1 *structFieldDecoder
  564. fieldHash2 int32
  565. fieldDecoder2 *structFieldDecoder
  566. fieldHash3 int32
  567. fieldDecoder3 *structFieldDecoder
  568. fieldHash4 int32
  569. fieldDecoder4 *structFieldDecoder
  570. }
  571. func (decoder *fourFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  572. if !iter.readObjectStart() {
  573. return
  574. }
  575. for {
  576. switch iter.readFieldHash() {
  577. case decoder.fieldHash1:
  578. decoder.fieldDecoder1.Decode(ptr, iter)
  579. case decoder.fieldHash2:
  580. decoder.fieldDecoder2.Decode(ptr, iter)
  581. case decoder.fieldHash3:
  582. decoder.fieldDecoder3.Decode(ptr, iter)
  583. case decoder.fieldHash4:
  584. decoder.fieldDecoder4.Decode(ptr, iter)
  585. default:
  586. iter.Skip()
  587. }
  588. if iter.isObjectEnd() {
  589. break
  590. }
  591. }
  592. if iter.Error != nil && iter.Error != io.EOF {
  593. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  594. }
  595. }
  596. type fiveFieldsStructDecoder struct {
  597. typ reflect.Type
  598. fieldHash1 int32
  599. fieldDecoder1 *structFieldDecoder
  600. fieldHash2 int32
  601. fieldDecoder2 *structFieldDecoder
  602. fieldHash3 int32
  603. fieldDecoder3 *structFieldDecoder
  604. fieldHash4 int32
  605. fieldDecoder4 *structFieldDecoder
  606. fieldHash5 int32
  607. fieldDecoder5 *structFieldDecoder
  608. }
  609. func (decoder *fiveFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  610. if !iter.readObjectStart() {
  611. return
  612. }
  613. for {
  614. switch iter.readFieldHash() {
  615. case decoder.fieldHash1:
  616. decoder.fieldDecoder1.Decode(ptr, iter)
  617. case decoder.fieldHash2:
  618. decoder.fieldDecoder2.Decode(ptr, iter)
  619. case decoder.fieldHash3:
  620. decoder.fieldDecoder3.Decode(ptr, iter)
  621. case decoder.fieldHash4:
  622. decoder.fieldDecoder4.Decode(ptr, iter)
  623. case decoder.fieldHash5:
  624. decoder.fieldDecoder5.Decode(ptr, iter)
  625. default:
  626. iter.Skip()
  627. }
  628. if iter.isObjectEnd() {
  629. break
  630. }
  631. }
  632. if iter.Error != nil && iter.Error != io.EOF {
  633. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  634. }
  635. }
  636. type sixFieldsStructDecoder struct {
  637. typ reflect.Type
  638. fieldHash1 int32
  639. fieldDecoder1 *structFieldDecoder
  640. fieldHash2 int32
  641. fieldDecoder2 *structFieldDecoder
  642. fieldHash3 int32
  643. fieldDecoder3 *structFieldDecoder
  644. fieldHash4 int32
  645. fieldDecoder4 *structFieldDecoder
  646. fieldHash5 int32
  647. fieldDecoder5 *structFieldDecoder
  648. fieldHash6 int32
  649. fieldDecoder6 *structFieldDecoder
  650. }
  651. func (decoder *sixFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  652. if !iter.readObjectStart() {
  653. return
  654. }
  655. for {
  656. switch iter.readFieldHash() {
  657. case decoder.fieldHash1:
  658. decoder.fieldDecoder1.Decode(ptr, iter)
  659. case decoder.fieldHash2:
  660. decoder.fieldDecoder2.Decode(ptr, iter)
  661. case decoder.fieldHash3:
  662. decoder.fieldDecoder3.Decode(ptr, iter)
  663. case decoder.fieldHash4:
  664. decoder.fieldDecoder4.Decode(ptr, iter)
  665. case decoder.fieldHash5:
  666. decoder.fieldDecoder5.Decode(ptr, iter)
  667. case decoder.fieldHash6:
  668. decoder.fieldDecoder6.Decode(ptr, iter)
  669. default:
  670. iter.Skip()
  671. }
  672. if iter.isObjectEnd() {
  673. break
  674. }
  675. }
  676. if iter.Error != nil && iter.Error != io.EOF {
  677. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  678. }
  679. }
  680. type sevenFieldsStructDecoder struct {
  681. typ reflect.Type
  682. fieldHash1 int32
  683. fieldDecoder1 *structFieldDecoder
  684. fieldHash2 int32
  685. fieldDecoder2 *structFieldDecoder
  686. fieldHash3 int32
  687. fieldDecoder3 *structFieldDecoder
  688. fieldHash4 int32
  689. fieldDecoder4 *structFieldDecoder
  690. fieldHash5 int32
  691. fieldDecoder5 *structFieldDecoder
  692. fieldHash6 int32
  693. fieldDecoder6 *structFieldDecoder
  694. fieldHash7 int32
  695. fieldDecoder7 *structFieldDecoder
  696. }
  697. func (decoder *sevenFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  698. if !iter.readObjectStart() {
  699. return
  700. }
  701. for {
  702. switch iter.readFieldHash() {
  703. case decoder.fieldHash1:
  704. decoder.fieldDecoder1.Decode(ptr, iter)
  705. case decoder.fieldHash2:
  706. decoder.fieldDecoder2.Decode(ptr, iter)
  707. case decoder.fieldHash3:
  708. decoder.fieldDecoder3.Decode(ptr, iter)
  709. case decoder.fieldHash4:
  710. decoder.fieldDecoder4.Decode(ptr, iter)
  711. case decoder.fieldHash5:
  712. decoder.fieldDecoder5.Decode(ptr, iter)
  713. case decoder.fieldHash6:
  714. decoder.fieldDecoder6.Decode(ptr, iter)
  715. case decoder.fieldHash7:
  716. decoder.fieldDecoder7.Decode(ptr, iter)
  717. default:
  718. iter.Skip()
  719. }
  720. if iter.isObjectEnd() {
  721. break
  722. }
  723. }
  724. if iter.Error != nil && iter.Error != io.EOF {
  725. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  726. }
  727. }
  728. type eightFieldsStructDecoder struct {
  729. typ reflect.Type
  730. fieldHash1 int32
  731. fieldDecoder1 *structFieldDecoder
  732. fieldHash2 int32
  733. fieldDecoder2 *structFieldDecoder
  734. fieldHash3 int32
  735. fieldDecoder3 *structFieldDecoder
  736. fieldHash4 int32
  737. fieldDecoder4 *structFieldDecoder
  738. fieldHash5 int32
  739. fieldDecoder5 *structFieldDecoder
  740. fieldHash6 int32
  741. fieldDecoder6 *structFieldDecoder
  742. fieldHash7 int32
  743. fieldDecoder7 *structFieldDecoder
  744. fieldHash8 int32
  745. fieldDecoder8 *structFieldDecoder
  746. }
  747. func (decoder *eightFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  748. if !iter.readObjectStart() {
  749. return
  750. }
  751. for {
  752. switch iter.readFieldHash() {
  753. case decoder.fieldHash1:
  754. decoder.fieldDecoder1.Decode(ptr, iter)
  755. case decoder.fieldHash2:
  756. decoder.fieldDecoder2.Decode(ptr, iter)
  757. case decoder.fieldHash3:
  758. decoder.fieldDecoder3.Decode(ptr, iter)
  759. case decoder.fieldHash4:
  760. decoder.fieldDecoder4.Decode(ptr, iter)
  761. case decoder.fieldHash5:
  762. decoder.fieldDecoder5.Decode(ptr, iter)
  763. case decoder.fieldHash6:
  764. decoder.fieldDecoder6.Decode(ptr, iter)
  765. case decoder.fieldHash7:
  766. decoder.fieldDecoder7.Decode(ptr, iter)
  767. case decoder.fieldHash8:
  768. decoder.fieldDecoder8.Decode(ptr, iter)
  769. default:
  770. iter.Skip()
  771. }
  772. if iter.isObjectEnd() {
  773. break
  774. }
  775. }
  776. if iter.Error != nil && iter.Error != io.EOF {
  777. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  778. }
  779. }
  780. type nineFieldsStructDecoder struct {
  781. typ reflect.Type
  782. fieldHash1 int32
  783. fieldDecoder1 *structFieldDecoder
  784. fieldHash2 int32
  785. fieldDecoder2 *structFieldDecoder
  786. fieldHash3 int32
  787. fieldDecoder3 *structFieldDecoder
  788. fieldHash4 int32
  789. fieldDecoder4 *structFieldDecoder
  790. fieldHash5 int32
  791. fieldDecoder5 *structFieldDecoder
  792. fieldHash6 int32
  793. fieldDecoder6 *structFieldDecoder
  794. fieldHash7 int32
  795. fieldDecoder7 *structFieldDecoder
  796. fieldHash8 int32
  797. fieldDecoder8 *structFieldDecoder
  798. fieldHash9 int32
  799. fieldDecoder9 *structFieldDecoder
  800. }
  801. func (decoder *nineFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  802. if !iter.readObjectStart() {
  803. return
  804. }
  805. for {
  806. switch iter.readFieldHash() {
  807. case decoder.fieldHash1:
  808. decoder.fieldDecoder1.Decode(ptr, iter)
  809. case decoder.fieldHash2:
  810. decoder.fieldDecoder2.Decode(ptr, iter)
  811. case decoder.fieldHash3:
  812. decoder.fieldDecoder3.Decode(ptr, iter)
  813. case decoder.fieldHash4:
  814. decoder.fieldDecoder4.Decode(ptr, iter)
  815. case decoder.fieldHash5:
  816. decoder.fieldDecoder5.Decode(ptr, iter)
  817. case decoder.fieldHash6:
  818. decoder.fieldDecoder6.Decode(ptr, iter)
  819. case decoder.fieldHash7:
  820. decoder.fieldDecoder7.Decode(ptr, iter)
  821. case decoder.fieldHash8:
  822. decoder.fieldDecoder8.Decode(ptr, iter)
  823. case decoder.fieldHash9:
  824. decoder.fieldDecoder9.Decode(ptr, iter)
  825. default:
  826. iter.Skip()
  827. }
  828. if iter.isObjectEnd() {
  829. break
  830. }
  831. }
  832. if iter.Error != nil && iter.Error != io.EOF {
  833. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  834. }
  835. }
  836. type tenFieldsStructDecoder struct {
  837. typ reflect.Type
  838. fieldHash1 int32
  839. fieldDecoder1 *structFieldDecoder
  840. fieldHash2 int32
  841. fieldDecoder2 *structFieldDecoder
  842. fieldHash3 int32
  843. fieldDecoder3 *structFieldDecoder
  844. fieldHash4 int32
  845. fieldDecoder4 *structFieldDecoder
  846. fieldHash5 int32
  847. fieldDecoder5 *structFieldDecoder
  848. fieldHash6 int32
  849. fieldDecoder6 *structFieldDecoder
  850. fieldHash7 int32
  851. fieldDecoder7 *structFieldDecoder
  852. fieldHash8 int32
  853. fieldDecoder8 *structFieldDecoder
  854. fieldHash9 int32
  855. fieldDecoder9 *structFieldDecoder
  856. fieldHash10 int32
  857. fieldDecoder10 *structFieldDecoder
  858. }
  859. func (decoder *tenFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  860. if !iter.readObjectStart() {
  861. return
  862. }
  863. for {
  864. switch iter.readFieldHash() {
  865. case decoder.fieldHash1:
  866. decoder.fieldDecoder1.Decode(ptr, iter)
  867. case decoder.fieldHash2:
  868. decoder.fieldDecoder2.Decode(ptr, iter)
  869. case decoder.fieldHash3:
  870. decoder.fieldDecoder3.Decode(ptr, iter)
  871. case decoder.fieldHash4:
  872. decoder.fieldDecoder4.Decode(ptr, iter)
  873. case decoder.fieldHash5:
  874. decoder.fieldDecoder5.Decode(ptr, iter)
  875. case decoder.fieldHash6:
  876. decoder.fieldDecoder6.Decode(ptr, iter)
  877. case decoder.fieldHash7:
  878. decoder.fieldDecoder7.Decode(ptr, iter)
  879. case decoder.fieldHash8:
  880. decoder.fieldDecoder8.Decode(ptr, iter)
  881. case decoder.fieldHash9:
  882. decoder.fieldDecoder9.Decode(ptr, iter)
  883. case decoder.fieldHash10:
  884. decoder.fieldDecoder10.Decode(ptr, iter)
  885. default:
  886. iter.Skip()
  887. }
  888. if iter.isObjectEnd() {
  889. break
  890. }
  891. }
  892. if iter.Error != nil && iter.Error != io.EOF {
  893. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  894. }
  895. }
  896. type structFieldDecoder struct {
  897. field *reflect.StructField
  898. fieldDecoder ValDecoder
  899. }
  900. func (decoder *structFieldDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  901. fieldPtr := unsafe.Pointer(uintptr(ptr) + decoder.field.Offset)
  902. decoder.fieldDecoder.Decode(fieldPtr, iter)
  903. if iter.Error != nil && iter.Error != io.EOF {
  904. iter.Error = fmt.Errorf("%s: %s", decoder.field.Name, iter.Error.Error())
  905. }
  906. }