feature_reflect_object.go 30 KB

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