feature_reflect_object.go 32 KB

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