feature_reflect_object.go 29 KB

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