reflect_struct_decoder.go 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974
  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[int64]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 int64
  31. var fieldHash2 int64
  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 int64
  52. var fieldName2 int64
  53. var fieldName3 int64
  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 int64
  81. var fieldName2 int64
  82. var fieldName3 int64
  83. var fieldName4 int64
  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 int64
  116. var fieldName2 int64
  117. var fieldName3 int64
  118. var fieldName4 int64
  119. var fieldName5 int64
  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 int64
  157. var fieldName2 int64
  158. var fieldName3 int64
  159. var fieldName4 int64
  160. var fieldName5 int64
  161. var fieldName6 int64
  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 int64
  204. var fieldName2 int64
  205. var fieldName3 int64
  206. var fieldName4 int64
  207. var fieldName5 int64
  208. var fieldName6 int64
  209. var fieldName7 int64
  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 int64
  257. var fieldName2 int64
  258. var fieldName3 int64
  259. var fieldName4 int64
  260. var fieldName5 int64
  261. var fieldName6 int64
  262. var fieldName7 int64
  263. var fieldName8 int64
  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 int64
  316. var fieldName2 int64
  317. var fieldName3 int64
  318. var fieldName4 int64
  319. var fieldName5 int64
  320. var fieldName6 int64
  321. var fieldName7 int64
  322. var fieldName8 int64
  323. var fieldName9 int64
  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 int64
  381. var fieldName2 int64
  382. var fieldName3 int64
  383. var fieldName4 int64
  384. var fieldName5 int64
  385. var fieldName6 int64
  386. var fieldName7 int64
  387. var fieldName8 int64
  388. var fieldName9 int64
  389. var fieldName10 int64
  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. decoder.decodeOneField(ptr, iter)
  463. for iter.nextToken() == ',' {
  464. decoder.decodeOneField(ptr, iter)
  465. }
  466. if iter.Error != nil && iter.Error != io.EOF {
  467. iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
  468. }
  469. }
  470. func (decoder *generalStructDecoder) decodeOneField(ptr unsafe.Pointer, iter *Iterator) {
  471. var field string
  472. var fieldDecoder *structFieldDecoder
  473. if iter.cfg.objectFieldMustBeSimpleString {
  474. fieldBytes := iter.ReadStringAsSlice()
  475. field = *(*string)(unsafe.Pointer(&fieldBytes))
  476. fieldDecoder = decoder.fields[field]
  477. if fieldDecoder == nil {
  478. fieldDecoder = decoder.fields[strings.ToLower(field)]
  479. }
  480. } else {
  481. field = iter.ReadString()
  482. fieldDecoder = decoder.fields[field]
  483. if fieldDecoder == nil {
  484. fieldDecoder = decoder.fields[strings.ToLower(field)]
  485. }
  486. }
  487. if fieldDecoder == nil {
  488. msg := "found unknown field: " + field
  489. if decoder.disallowUnknownFields {
  490. iter.ReportError("ReadObject", msg)
  491. }
  492. c := iter.nextToken()
  493. if c != ':' {
  494. iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c}))
  495. }
  496. iter.Skip()
  497. return
  498. }
  499. c := iter.nextToken()
  500. if c != ':' {
  501. iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c}))
  502. }
  503. fieldDecoder.Decode(ptr, iter)
  504. }
  505. type skipObjectDecoder struct {
  506. typ reflect.Type
  507. }
  508. func (decoder *skipObjectDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  509. valueType := iter.WhatIsNext()
  510. if valueType != ObjectValue && valueType != NilValue {
  511. iter.ReportError("skipObjectDecoder", "expect object or null")
  512. return
  513. }
  514. iter.Skip()
  515. }
  516. type oneFieldStructDecoder struct {
  517. typ reflect.Type
  518. fieldHash int64
  519. fieldDecoder *structFieldDecoder
  520. }
  521. func (decoder *oneFieldStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  522. if !iter.readObjectStart() {
  523. return
  524. }
  525. for {
  526. if iter.readFieldHash() == decoder.fieldHash {
  527. decoder.fieldDecoder.Decode(ptr, iter)
  528. } else {
  529. iter.Skip()
  530. }
  531. if iter.isObjectEnd() {
  532. break
  533. }
  534. }
  535. if iter.Error != nil && iter.Error != io.EOF {
  536. iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
  537. }
  538. }
  539. type twoFieldsStructDecoder struct {
  540. typ reflect.Type
  541. fieldHash1 int64
  542. fieldDecoder1 *structFieldDecoder
  543. fieldHash2 int64
  544. fieldDecoder2 *structFieldDecoder
  545. }
  546. func (decoder *twoFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  547. if !iter.readObjectStart() {
  548. return
  549. }
  550. for {
  551. switch iter.readFieldHash() {
  552. case decoder.fieldHash1:
  553. decoder.fieldDecoder1.Decode(ptr, iter)
  554. case decoder.fieldHash2:
  555. decoder.fieldDecoder2.Decode(ptr, iter)
  556. default:
  557. iter.Skip()
  558. }
  559. if iter.isObjectEnd() {
  560. break
  561. }
  562. }
  563. if iter.Error != nil && iter.Error != io.EOF {
  564. iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
  565. }
  566. }
  567. type threeFieldsStructDecoder struct {
  568. typ reflect.Type
  569. fieldHash1 int64
  570. fieldDecoder1 *structFieldDecoder
  571. fieldHash2 int64
  572. fieldDecoder2 *structFieldDecoder
  573. fieldHash3 int64
  574. fieldDecoder3 *structFieldDecoder
  575. }
  576. func (decoder *threeFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  577. if !iter.readObjectStart() {
  578. return
  579. }
  580. for {
  581. switch iter.readFieldHash() {
  582. case decoder.fieldHash1:
  583. decoder.fieldDecoder1.Decode(ptr, iter)
  584. case decoder.fieldHash2:
  585. decoder.fieldDecoder2.Decode(ptr, iter)
  586. case decoder.fieldHash3:
  587. decoder.fieldDecoder3.Decode(ptr, iter)
  588. default:
  589. iter.Skip()
  590. }
  591. if iter.isObjectEnd() {
  592. break
  593. }
  594. }
  595. if iter.Error != nil && iter.Error != io.EOF {
  596. iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
  597. }
  598. }
  599. type fourFieldsStructDecoder struct {
  600. typ reflect.Type
  601. fieldHash1 int64
  602. fieldDecoder1 *structFieldDecoder
  603. fieldHash2 int64
  604. fieldDecoder2 *structFieldDecoder
  605. fieldHash3 int64
  606. fieldDecoder3 *structFieldDecoder
  607. fieldHash4 int64
  608. fieldDecoder4 *structFieldDecoder
  609. }
  610. func (decoder *fourFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  611. if !iter.readObjectStart() {
  612. return
  613. }
  614. for {
  615. switch iter.readFieldHash() {
  616. case decoder.fieldHash1:
  617. decoder.fieldDecoder1.Decode(ptr, iter)
  618. case decoder.fieldHash2:
  619. decoder.fieldDecoder2.Decode(ptr, iter)
  620. case decoder.fieldHash3:
  621. decoder.fieldDecoder3.Decode(ptr, iter)
  622. case decoder.fieldHash4:
  623. decoder.fieldDecoder4.Decode(ptr, iter)
  624. default:
  625. iter.Skip()
  626. }
  627. if iter.isObjectEnd() {
  628. break
  629. }
  630. }
  631. if iter.Error != nil && iter.Error != io.EOF {
  632. iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
  633. }
  634. }
  635. type fiveFieldsStructDecoder struct {
  636. typ reflect.Type
  637. fieldHash1 int64
  638. fieldDecoder1 *structFieldDecoder
  639. fieldHash2 int64
  640. fieldDecoder2 *structFieldDecoder
  641. fieldHash3 int64
  642. fieldDecoder3 *structFieldDecoder
  643. fieldHash4 int64
  644. fieldDecoder4 *structFieldDecoder
  645. fieldHash5 int64
  646. fieldDecoder5 *structFieldDecoder
  647. }
  648. func (decoder *fiveFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  649. if !iter.readObjectStart() {
  650. return
  651. }
  652. for {
  653. switch iter.readFieldHash() {
  654. case decoder.fieldHash1:
  655. decoder.fieldDecoder1.Decode(ptr, iter)
  656. case decoder.fieldHash2:
  657. decoder.fieldDecoder2.Decode(ptr, iter)
  658. case decoder.fieldHash3:
  659. decoder.fieldDecoder3.Decode(ptr, iter)
  660. case decoder.fieldHash4:
  661. decoder.fieldDecoder4.Decode(ptr, iter)
  662. case decoder.fieldHash5:
  663. decoder.fieldDecoder5.Decode(ptr, iter)
  664. default:
  665. iter.Skip()
  666. }
  667. if iter.isObjectEnd() {
  668. break
  669. }
  670. }
  671. if iter.Error != nil && iter.Error != io.EOF {
  672. iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
  673. }
  674. }
  675. type sixFieldsStructDecoder struct {
  676. typ reflect.Type
  677. fieldHash1 int64
  678. fieldDecoder1 *structFieldDecoder
  679. fieldHash2 int64
  680. fieldDecoder2 *structFieldDecoder
  681. fieldHash3 int64
  682. fieldDecoder3 *structFieldDecoder
  683. fieldHash4 int64
  684. fieldDecoder4 *structFieldDecoder
  685. fieldHash5 int64
  686. fieldDecoder5 *structFieldDecoder
  687. fieldHash6 int64
  688. fieldDecoder6 *structFieldDecoder
  689. }
  690. func (decoder *sixFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  691. if !iter.readObjectStart() {
  692. return
  693. }
  694. for {
  695. switch iter.readFieldHash() {
  696. case decoder.fieldHash1:
  697. decoder.fieldDecoder1.Decode(ptr, iter)
  698. case decoder.fieldHash2:
  699. decoder.fieldDecoder2.Decode(ptr, iter)
  700. case decoder.fieldHash3:
  701. decoder.fieldDecoder3.Decode(ptr, iter)
  702. case decoder.fieldHash4:
  703. decoder.fieldDecoder4.Decode(ptr, iter)
  704. case decoder.fieldHash5:
  705. decoder.fieldDecoder5.Decode(ptr, iter)
  706. case decoder.fieldHash6:
  707. decoder.fieldDecoder6.Decode(ptr, iter)
  708. default:
  709. iter.Skip()
  710. }
  711. if iter.isObjectEnd() {
  712. break
  713. }
  714. }
  715. if iter.Error != nil && iter.Error != io.EOF {
  716. iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
  717. }
  718. }
  719. type sevenFieldsStructDecoder struct {
  720. typ reflect.Type
  721. fieldHash1 int64
  722. fieldDecoder1 *structFieldDecoder
  723. fieldHash2 int64
  724. fieldDecoder2 *structFieldDecoder
  725. fieldHash3 int64
  726. fieldDecoder3 *structFieldDecoder
  727. fieldHash4 int64
  728. fieldDecoder4 *structFieldDecoder
  729. fieldHash5 int64
  730. fieldDecoder5 *structFieldDecoder
  731. fieldHash6 int64
  732. fieldDecoder6 *structFieldDecoder
  733. fieldHash7 int64
  734. fieldDecoder7 *structFieldDecoder
  735. }
  736. func (decoder *sevenFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  737. if !iter.readObjectStart() {
  738. return
  739. }
  740. for {
  741. switch iter.readFieldHash() {
  742. case decoder.fieldHash1:
  743. decoder.fieldDecoder1.Decode(ptr, iter)
  744. case decoder.fieldHash2:
  745. decoder.fieldDecoder2.Decode(ptr, iter)
  746. case decoder.fieldHash3:
  747. decoder.fieldDecoder3.Decode(ptr, iter)
  748. case decoder.fieldHash4:
  749. decoder.fieldDecoder4.Decode(ptr, iter)
  750. case decoder.fieldHash5:
  751. decoder.fieldDecoder5.Decode(ptr, iter)
  752. case decoder.fieldHash6:
  753. decoder.fieldDecoder6.Decode(ptr, iter)
  754. case decoder.fieldHash7:
  755. decoder.fieldDecoder7.Decode(ptr, iter)
  756. default:
  757. iter.Skip()
  758. }
  759. if iter.isObjectEnd() {
  760. break
  761. }
  762. }
  763. if iter.Error != nil && iter.Error != io.EOF {
  764. iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
  765. }
  766. }
  767. type eightFieldsStructDecoder struct {
  768. typ reflect.Type
  769. fieldHash1 int64
  770. fieldDecoder1 *structFieldDecoder
  771. fieldHash2 int64
  772. fieldDecoder2 *structFieldDecoder
  773. fieldHash3 int64
  774. fieldDecoder3 *structFieldDecoder
  775. fieldHash4 int64
  776. fieldDecoder4 *structFieldDecoder
  777. fieldHash5 int64
  778. fieldDecoder5 *structFieldDecoder
  779. fieldHash6 int64
  780. fieldDecoder6 *structFieldDecoder
  781. fieldHash7 int64
  782. fieldDecoder7 *structFieldDecoder
  783. fieldHash8 int64
  784. fieldDecoder8 *structFieldDecoder
  785. }
  786. func (decoder *eightFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  787. if !iter.readObjectStart() {
  788. return
  789. }
  790. for {
  791. switch iter.readFieldHash() {
  792. case decoder.fieldHash1:
  793. decoder.fieldDecoder1.Decode(ptr, iter)
  794. case decoder.fieldHash2:
  795. decoder.fieldDecoder2.Decode(ptr, iter)
  796. case decoder.fieldHash3:
  797. decoder.fieldDecoder3.Decode(ptr, iter)
  798. case decoder.fieldHash4:
  799. decoder.fieldDecoder4.Decode(ptr, iter)
  800. case decoder.fieldHash5:
  801. decoder.fieldDecoder5.Decode(ptr, iter)
  802. case decoder.fieldHash6:
  803. decoder.fieldDecoder6.Decode(ptr, iter)
  804. case decoder.fieldHash7:
  805. decoder.fieldDecoder7.Decode(ptr, iter)
  806. case decoder.fieldHash8:
  807. decoder.fieldDecoder8.Decode(ptr, iter)
  808. default:
  809. iter.Skip()
  810. }
  811. if iter.isObjectEnd() {
  812. break
  813. }
  814. }
  815. if iter.Error != nil && iter.Error != io.EOF {
  816. iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
  817. }
  818. }
  819. type nineFieldsStructDecoder struct {
  820. typ reflect.Type
  821. fieldHash1 int64
  822. fieldDecoder1 *structFieldDecoder
  823. fieldHash2 int64
  824. fieldDecoder2 *structFieldDecoder
  825. fieldHash3 int64
  826. fieldDecoder3 *structFieldDecoder
  827. fieldHash4 int64
  828. fieldDecoder4 *structFieldDecoder
  829. fieldHash5 int64
  830. fieldDecoder5 *structFieldDecoder
  831. fieldHash6 int64
  832. fieldDecoder6 *structFieldDecoder
  833. fieldHash7 int64
  834. fieldDecoder7 *structFieldDecoder
  835. fieldHash8 int64
  836. fieldDecoder8 *structFieldDecoder
  837. fieldHash9 int64
  838. fieldDecoder9 *structFieldDecoder
  839. }
  840. func (decoder *nineFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  841. if !iter.readObjectStart() {
  842. return
  843. }
  844. for {
  845. switch iter.readFieldHash() {
  846. case decoder.fieldHash1:
  847. decoder.fieldDecoder1.Decode(ptr, iter)
  848. case decoder.fieldHash2:
  849. decoder.fieldDecoder2.Decode(ptr, iter)
  850. case decoder.fieldHash3:
  851. decoder.fieldDecoder3.Decode(ptr, iter)
  852. case decoder.fieldHash4:
  853. decoder.fieldDecoder4.Decode(ptr, iter)
  854. case decoder.fieldHash5:
  855. decoder.fieldDecoder5.Decode(ptr, iter)
  856. case decoder.fieldHash6:
  857. decoder.fieldDecoder6.Decode(ptr, iter)
  858. case decoder.fieldHash7:
  859. decoder.fieldDecoder7.Decode(ptr, iter)
  860. case decoder.fieldHash8:
  861. decoder.fieldDecoder8.Decode(ptr, iter)
  862. case decoder.fieldHash9:
  863. decoder.fieldDecoder9.Decode(ptr, iter)
  864. default:
  865. iter.Skip()
  866. }
  867. if iter.isObjectEnd() {
  868. break
  869. }
  870. }
  871. if iter.Error != nil && iter.Error != io.EOF {
  872. iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
  873. }
  874. }
  875. type tenFieldsStructDecoder struct {
  876. typ reflect.Type
  877. fieldHash1 int64
  878. fieldDecoder1 *structFieldDecoder
  879. fieldHash2 int64
  880. fieldDecoder2 *structFieldDecoder
  881. fieldHash3 int64
  882. fieldDecoder3 *structFieldDecoder
  883. fieldHash4 int64
  884. fieldDecoder4 *structFieldDecoder
  885. fieldHash5 int64
  886. fieldDecoder5 *structFieldDecoder
  887. fieldHash6 int64
  888. fieldDecoder6 *structFieldDecoder
  889. fieldHash7 int64
  890. fieldDecoder7 *structFieldDecoder
  891. fieldHash8 int64
  892. fieldDecoder8 *structFieldDecoder
  893. fieldHash9 int64
  894. fieldDecoder9 *structFieldDecoder
  895. fieldHash10 int64
  896. fieldDecoder10 *structFieldDecoder
  897. }
  898. func (decoder *tenFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  899. if !iter.readObjectStart() {
  900. return
  901. }
  902. for {
  903. switch iter.readFieldHash() {
  904. case decoder.fieldHash1:
  905. decoder.fieldDecoder1.Decode(ptr, iter)
  906. case decoder.fieldHash2:
  907. decoder.fieldDecoder2.Decode(ptr, iter)
  908. case decoder.fieldHash3:
  909. decoder.fieldDecoder3.Decode(ptr, iter)
  910. case decoder.fieldHash4:
  911. decoder.fieldDecoder4.Decode(ptr, iter)
  912. case decoder.fieldHash5:
  913. decoder.fieldDecoder5.Decode(ptr, iter)
  914. case decoder.fieldHash6:
  915. decoder.fieldDecoder6.Decode(ptr, iter)
  916. case decoder.fieldHash7:
  917. decoder.fieldDecoder7.Decode(ptr, iter)
  918. case decoder.fieldHash8:
  919. decoder.fieldDecoder8.Decode(ptr, iter)
  920. case decoder.fieldHash9:
  921. decoder.fieldDecoder9.Decode(ptr, iter)
  922. case decoder.fieldHash10:
  923. decoder.fieldDecoder10.Decode(ptr, iter)
  924. default:
  925. iter.Skip()
  926. }
  927. if iter.isObjectEnd() {
  928. break
  929. }
  930. }
  931. if iter.Error != nil && iter.Error != io.EOF {
  932. iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
  933. }
  934. }
  935. type structFieldDecoder struct {
  936. field *reflect.StructField
  937. fieldDecoder ValDecoder
  938. }
  939. func (decoder *structFieldDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  940. fieldPtr := unsafe.Pointer(uintptr(ptr) + decoder.field.Offset)
  941. decoder.fieldDecoder.Decode(fieldPtr, iter)
  942. if iter.Error != nil && iter.Error != io.EOF {
  943. iter.Error = fmt.Errorf("%s: %s", decoder.field.Name, iter.Error.Error())
  944. }
  945. }