feature_reflect_struct_decoder.go 26 KB

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