feature_reflect_object.go 31 KB

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