reflect_struct_decoder.go 28 KB

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