feature_reflect_object.go 29 KB

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