reflect_struct_decoder.go 28 KB

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