feature_reflect_object.go 32 KB

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