feature_reflect_struct_decoder.go 26 KB

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