http urls monitor.

reflect_struct_decoder.go 28KB

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