feature_reflect_object.go 31 KB

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