feature_reflect_object.go 29 KB

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