feature_reflect_object.go 29 KB

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