feature_reflect_object.go 30 KB

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