feature_reflect.go 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865
  1. package jsoniter
  2. import (
  3. "errors"
  4. "fmt"
  5. "io"
  6. "reflect"
  7. "strconv"
  8. "strings"
  9. "sync/atomic"
  10. "unsafe"
  11. )
  12. /*
  13. Reflection on type to create decoders, which is then cached
  14. Reflection on value is avoided as we can, as the reflect.Value itself will allocate, with following exceptions
  15. 1. create instance of new value, for example *int will need a int to be allocated
  16. 2. append to slice, if the existing cap is not enough, allocate will be done using Reflect.New
  17. 3. assignment to map, both key and value will be reflect.Value
  18. For a simple struct binding, it will be reflect.Value free and allocation free
  19. */
  20. // Decoder works like a father class for sub-type decoders
  21. type Decoder interface {
  22. decode(ptr unsafe.Pointer, iter *Iterator)
  23. }
  24. type stringDecoder struct {
  25. }
  26. func (decoder *stringDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  27. *((*string)(ptr)) = iter.ReadString()
  28. }
  29. type intDecoder struct {
  30. }
  31. func (decoder *intDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  32. *((*int)(ptr)) = iter.ReadInt()
  33. }
  34. type int8Decoder struct {
  35. }
  36. func (decoder *int8Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  37. *((*int8)(ptr)) = iter.ReadInt8()
  38. }
  39. type int16Decoder struct {
  40. }
  41. func (decoder *int16Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  42. *((*int16)(ptr)) = iter.ReadInt16()
  43. }
  44. type int32Decoder struct {
  45. }
  46. func (decoder *int32Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  47. *((*int32)(ptr)) = iter.ReadInt32()
  48. }
  49. type int64Decoder struct {
  50. }
  51. func (decoder *int64Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  52. *((*int64)(ptr)) = iter.ReadInt64()
  53. }
  54. type uintDecoder struct {
  55. }
  56. func (decoder *uintDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  57. *((*uint)(ptr)) = iter.ReadUint()
  58. }
  59. type uint8Decoder struct {
  60. }
  61. func (decoder *uint8Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  62. *((*uint8)(ptr)) = iter.ReadUint8()
  63. }
  64. type uint16Decoder struct {
  65. }
  66. func (decoder *uint16Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  67. *((*uint16)(ptr)) = iter.ReadUint16()
  68. }
  69. type uint32Decoder struct {
  70. }
  71. func (decoder *uint32Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  72. *((*uint32)(ptr)) = iter.ReadUint32()
  73. }
  74. type uint64Decoder struct {
  75. }
  76. func (decoder *uint64Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  77. *((*uint64)(ptr)) = iter.ReadUint64()
  78. }
  79. type float32Decoder struct {
  80. }
  81. func (decoder *float32Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  82. *((*float32)(ptr)) = iter.ReadFloat32()
  83. }
  84. type float64Decoder struct {
  85. }
  86. func (decoder *float64Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  87. *((*float64)(ptr)) = iter.ReadFloat64()
  88. }
  89. type boolDecoder struct {
  90. }
  91. func (decoder *boolDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  92. *((*bool)(ptr)) = iter.ReadBool()
  93. }
  94. type interfaceDecoder struct {
  95. }
  96. func (decoder *interfaceDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  97. *((*interface{})(ptr)) = iter.ReadAny().Get()
  98. }
  99. type anyDecoder struct {
  100. }
  101. func (decoder *anyDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  102. *((*Any)(ptr)) = *iter.ReadAny()
  103. }
  104. type stringNumberDecoder struct {
  105. elemDecoder Decoder
  106. }
  107. func (decoder *stringNumberDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  108. c := iter.nextToken()
  109. if c != '"' {
  110. iter.reportError("stringNumberDecoder", `expect "`)
  111. return
  112. }
  113. decoder.elemDecoder.decode(ptr, iter)
  114. if iter.Error != nil {
  115. return
  116. }
  117. c = iter.readByte()
  118. if c != '"' {
  119. iter.reportError("stringNumberDecoder", `expect "`)
  120. return
  121. }
  122. }
  123. type optionalDecoder struct {
  124. valueType reflect.Type
  125. valueDecoder Decoder
  126. }
  127. func (decoder *optionalDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  128. if iter.ReadNil() {
  129. *((*unsafe.Pointer)(ptr)) = nil
  130. } else {
  131. if *((*unsafe.Pointer)(ptr)) == nil {
  132. // pointer to null, we have to allocate memory to hold the value
  133. value := reflect.New(decoder.valueType)
  134. decoder.valueDecoder.decode(unsafe.Pointer(value.Pointer()), iter)
  135. *((*uintptr)(ptr)) = value.Pointer()
  136. } else {
  137. // reuse existing instance
  138. decoder.valueDecoder.decode(*((*unsafe.Pointer)(ptr)), iter)
  139. }
  140. }
  141. }
  142. type generalStructDecoder struct {
  143. typ reflect.Type
  144. fields map[string]*structFieldDecoder
  145. }
  146. func (decoder *generalStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  147. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  148. fieldDecoder := decoder.fields[field]
  149. if fieldDecoder == nil {
  150. iter.Skip()
  151. } else {
  152. fieldDecoder.decode(ptr, iter)
  153. }
  154. }
  155. if iter.Error != nil && iter.Error != io.EOF {
  156. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  157. }
  158. }
  159. type skipDecoder struct {
  160. typ reflect.Type
  161. }
  162. func (decoder *skipDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  163. iter.Skip()
  164. if iter.Error != nil && iter.Error != io.EOF {
  165. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  166. }
  167. }
  168. type oneFieldStructDecoder struct {
  169. typ reflect.Type
  170. fieldName string
  171. fieldDecoder *structFieldDecoder
  172. }
  173. func (decoder *oneFieldStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  174. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  175. if field == decoder.fieldName {
  176. decoder.fieldDecoder.decode(ptr, iter)
  177. } else {
  178. iter.Skip()
  179. }
  180. }
  181. if iter.Error != nil && iter.Error != io.EOF {
  182. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  183. }
  184. }
  185. type twoFieldsStructDecoder struct {
  186. typ reflect.Type
  187. fieldName1 string
  188. fieldDecoder1 *structFieldDecoder
  189. fieldName2 string
  190. fieldDecoder2 *structFieldDecoder
  191. }
  192. func (decoder *twoFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  193. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  194. switch field {
  195. case decoder.fieldName1:
  196. decoder.fieldDecoder1.decode(ptr, iter)
  197. case decoder.fieldName2:
  198. decoder.fieldDecoder2.decode(ptr, iter)
  199. default:
  200. iter.Skip()
  201. }
  202. }
  203. if iter.Error != nil && iter.Error != io.EOF {
  204. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  205. }
  206. }
  207. type threeFieldsStructDecoder struct {
  208. typ reflect.Type
  209. fieldName1 string
  210. fieldDecoder1 *structFieldDecoder
  211. fieldName2 string
  212. fieldDecoder2 *structFieldDecoder
  213. fieldName3 string
  214. fieldDecoder3 *structFieldDecoder
  215. }
  216. func (decoder *threeFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  217. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  218. switch field {
  219. case decoder.fieldName1:
  220. decoder.fieldDecoder1.decode(ptr, iter)
  221. case decoder.fieldName2:
  222. decoder.fieldDecoder2.decode(ptr, iter)
  223. case decoder.fieldName3:
  224. decoder.fieldDecoder3.decode(ptr, iter)
  225. default:
  226. iter.Skip()
  227. }
  228. }
  229. if iter.Error != nil && iter.Error != io.EOF {
  230. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  231. }
  232. }
  233. type fourFieldsStructDecoder struct {
  234. typ reflect.Type
  235. fieldName1 string
  236. fieldDecoder1 *structFieldDecoder
  237. fieldName2 string
  238. fieldDecoder2 *structFieldDecoder
  239. fieldName3 string
  240. fieldDecoder3 *structFieldDecoder
  241. fieldName4 string
  242. fieldDecoder4 *structFieldDecoder
  243. }
  244. func (decoder *fourFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  245. if !iter.readObjectStart() {
  246. return
  247. }
  248. field := iter.readObjectField()
  249. switch field {
  250. case decoder.fieldName1:
  251. decoder.fieldDecoder1.decode(ptr, iter)
  252. case decoder.fieldName2:
  253. decoder.fieldDecoder2.decode(ptr, iter)
  254. case decoder.fieldName3:
  255. decoder.fieldDecoder3.decode(ptr, iter)
  256. case decoder.fieldName4:
  257. decoder.fieldDecoder4.decode(ptr, iter)
  258. default:
  259. iter.Skip()
  260. }
  261. for iter.nextToken() != ',' {
  262. field := iter.readObjectField()
  263. switch field {
  264. case decoder.fieldName1:
  265. decoder.fieldDecoder1.decode(ptr, iter)
  266. case decoder.fieldName2:
  267. decoder.fieldDecoder2.decode(ptr, iter)
  268. case decoder.fieldName3:
  269. decoder.fieldDecoder3.decode(ptr, iter)
  270. case decoder.fieldName4:
  271. decoder.fieldDecoder4.decode(ptr, iter)
  272. default:
  273. iter.Skip()
  274. }
  275. }
  276. if iter.Error != nil && iter.Error != io.EOF {
  277. iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error())
  278. }
  279. }
  280. type structFieldDecoder struct {
  281. field *reflect.StructField
  282. fieldDecoder Decoder
  283. }
  284. func (decoder *structFieldDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  285. fieldPtr := uintptr(ptr) + decoder.field.Offset
  286. decoder.fieldDecoder.decode(unsafe.Pointer(fieldPtr), iter)
  287. if iter.Error != nil && iter.Error != io.EOF {
  288. iter.Error = fmt.Errorf("%s: %s", decoder.field.Name, iter.Error.Error())
  289. }
  290. }
  291. type mapDecoder struct {
  292. mapType reflect.Type
  293. elemType reflect.Type
  294. elemDecoder Decoder
  295. mapInterface emptyInterface
  296. }
  297. func (decoder *mapDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  298. // dark magic to cast unsafe.Pointer back to interface{} using reflect.Type
  299. mapInterface := decoder.mapInterface
  300. mapInterface.word = ptr
  301. realInterface := (*interface{})(unsafe.Pointer(&mapInterface))
  302. realVal := reflect.ValueOf(*realInterface).Elem()
  303. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  304. elem := reflect.New(decoder.elemType)
  305. decoder.elemDecoder.decode(unsafe.Pointer(elem.Pointer()), iter)
  306. // to put into map, we have to use reflection
  307. realVal.SetMapIndex(reflect.ValueOf(string([]byte(field))), elem.Elem())
  308. }
  309. }
  310. type sliceDecoder struct {
  311. sliceType reflect.Type
  312. elemType reflect.Type
  313. elemDecoder Decoder
  314. }
  315. // sliceHeader is a safe version of SliceHeader used within this package.
  316. type sliceHeader struct {
  317. Data unsafe.Pointer
  318. Len int
  319. Cap int
  320. }
  321. func (decoder *sliceDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  322. decoder.doDecode(ptr, iter)
  323. if iter.Error != nil && iter.Error != io.EOF {
  324. iter.Error = fmt.Errorf("%v: %s", decoder.sliceType, iter.Error.Error())
  325. }
  326. }
  327. func (decoder *sliceDecoder) doDecode(ptr unsafe.Pointer, iter *Iterator) {
  328. slice := (*sliceHeader)(ptr)
  329. reuseSlice(slice, decoder.sliceType, 4)
  330. if !iter.ReadArray() {
  331. return
  332. }
  333. offset := uintptr(0)
  334. decoder.elemDecoder.decode(unsafe.Pointer(uintptr(slice.Data)+offset), iter)
  335. if !iter.ReadArray() {
  336. slice.Len = 1
  337. return
  338. }
  339. offset += decoder.elemType.Size()
  340. decoder.elemDecoder.decode(unsafe.Pointer(uintptr(slice.Data)+offset), iter)
  341. if !iter.ReadArray() {
  342. slice.Len = 2
  343. return
  344. }
  345. offset += decoder.elemType.Size()
  346. decoder.elemDecoder.decode(unsafe.Pointer(uintptr(slice.Data)+offset), iter)
  347. if !iter.ReadArray() {
  348. slice.Len = 3
  349. return
  350. }
  351. offset += decoder.elemType.Size()
  352. decoder.elemDecoder.decode(unsafe.Pointer(uintptr(slice.Data)+offset), iter)
  353. slice.Len = 4
  354. for iter.ReadArray() {
  355. growOne(slice, decoder.sliceType, decoder.elemType)
  356. offset += decoder.elemType.Size()
  357. decoder.elemDecoder.decode(unsafe.Pointer(uintptr(slice.Data)+offset), iter)
  358. }
  359. }
  360. // grow grows the slice s so that it can hold extra more values, allocating
  361. // more capacity if needed. It also returns the old and new slice lengths.
  362. func growOne(slice *sliceHeader, sliceType reflect.Type, elementType reflect.Type) {
  363. newLen := slice.Len + 1
  364. if newLen <= slice.Cap {
  365. slice.Len = newLen
  366. return
  367. }
  368. newCap := slice.Cap
  369. if newCap == 0 {
  370. newCap = 1
  371. } else {
  372. for newCap < newLen {
  373. if slice.Len < 1024 {
  374. newCap += newCap
  375. } else {
  376. newCap += newCap / 4
  377. }
  378. }
  379. }
  380. dst := unsafe.Pointer(reflect.MakeSlice(sliceType, newLen, newCap).Pointer())
  381. // copy old array into new array
  382. originalBytesCount := uintptr(slice.Len) * elementType.Size()
  383. srcPtr := (*[1 << 30]byte)(slice.Data)
  384. dstPtr := (*[1 << 30]byte)(dst)
  385. for i := uintptr(0); i < originalBytesCount; i++ {
  386. dstPtr[i] = srcPtr[i]
  387. }
  388. slice.Len = newLen
  389. slice.Cap = newCap
  390. slice.Data = dst
  391. }
  392. func reuseSlice(slice *sliceHeader, sliceType reflect.Type, expectedCap int) {
  393. if expectedCap <= slice.Cap {
  394. return
  395. }
  396. dst := unsafe.Pointer(reflect.MakeSlice(sliceType, 0, expectedCap).Pointer())
  397. slice.Cap = expectedCap
  398. slice.Data = dst
  399. }
  400. var DECODERS unsafe.Pointer
  401. func addDecoderToCache(cacheKey reflect.Type, decoder Decoder) {
  402. retry := true
  403. for retry {
  404. ptr := atomic.LoadPointer(&DECODERS)
  405. cache := *(*map[reflect.Type]Decoder)(ptr)
  406. copy := map[reflect.Type]Decoder{}
  407. for k, v := range cache {
  408. copy[k] = v
  409. }
  410. copy[cacheKey] = decoder
  411. retry = !atomic.CompareAndSwapPointer(&DECODERS, ptr, unsafe.Pointer(&copy))
  412. }
  413. }
  414. func getDecoderFromCache(cacheKey reflect.Type) Decoder {
  415. ptr := atomic.LoadPointer(&DECODERS)
  416. cache := *(*map[reflect.Type]Decoder)(ptr)
  417. return cache[cacheKey]
  418. }
  419. var typeDecoders map[string]Decoder
  420. var fieldDecoders map[string]Decoder
  421. var extensions []ExtensionFunc
  422. func init() {
  423. typeDecoders = map[string]Decoder{}
  424. fieldDecoders = map[string]Decoder{}
  425. extensions = []ExtensionFunc{}
  426. atomic.StorePointer(&DECODERS, unsafe.Pointer(&map[string]Decoder{}))
  427. }
  428. type DecoderFunc func(ptr unsafe.Pointer, iter *Iterator)
  429. type ExtensionFunc func(typ reflect.Type, field *reflect.StructField) ([]string, DecoderFunc)
  430. type funcDecoder struct {
  431. fun DecoderFunc
  432. }
  433. func (decoder *funcDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  434. decoder.fun(ptr, iter)
  435. }
  436. // RegisterTypeDecoder can register a type for json object
  437. func RegisterTypeDecoder(typ string, fun DecoderFunc) {
  438. typeDecoders[typ] = &funcDecoder{fun}
  439. }
  440. // RegisterFieldDecoder can register a type for json field
  441. func RegisterFieldDecoder(typ string, field string, fun DecoderFunc) {
  442. fieldDecoders[fmt.Sprintf("%s/%s", typ, field)] = &funcDecoder{fun}
  443. }
  444. // RegisterExtension can register a custom extension
  445. func RegisterExtension(extension ExtensionFunc) {
  446. extensions = append(extensions, extension)
  447. }
  448. // CleanDecoders cleans decoders registered
  449. func CleanDecoders() {
  450. typeDecoders = map[string]Decoder{}
  451. fieldDecoders = map[string]Decoder{}
  452. }
  453. // emptyInterface is the header for an interface{} value.
  454. type emptyInterface struct {
  455. typ *struct{}
  456. word unsafe.Pointer
  457. }
  458. // ReadAny converts a json object in a Iterator instance to Any
  459. func (iter *Iterator) ReadAny() (ret *Any) {
  460. valueType := iter.WhatIsNext()
  461. switch valueType {
  462. case String:
  463. return MakeAny(iter.ReadString())
  464. case Number:
  465. return iter.readNumber()
  466. case Null:
  467. return MakeAny(nil)
  468. case Bool:
  469. return MakeAny(iter.ReadBool())
  470. case Array:
  471. val := []interface{}{}
  472. for iter.ReadArray() {
  473. element := iter.ReadAny()
  474. if iter.Error != nil {
  475. return
  476. }
  477. val = append(val, element.val)
  478. }
  479. return MakeAny(val)
  480. case Object:
  481. val := map[string]interface{}{}
  482. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  483. element := iter.ReadAny()
  484. if iter.Error != nil {
  485. return
  486. }
  487. val[string([]byte(field))] = element.val
  488. }
  489. return MakeAny(val)
  490. default:
  491. iter.reportError("ReadAny", fmt.Sprintf("unexpected value type: %v", valueType))
  492. return MakeAny(nil)
  493. }
  494. }
  495. func (iter *Iterator) readNumber() (ret *Any) {
  496. strBuf := [8]byte{}
  497. str := strBuf[0:0]
  498. hasMore := true
  499. foundFloat := false
  500. foundNegative := false
  501. for hasMore {
  502. for i := iter.head; i < iter.tail; i++ {
  503. c := iter.buf[i]
  504. switch c {
  505. case '-':
  506. foundNegative = true
  507. str = append(str, c)
  508. continue
  509. case '+', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
  510. str = append(str, c)
  511. continue
  512. case '.', 'e', 'E':
  513. foundFloat = true
  514. str = append(str, c)
  515. continue
  516. default:
  517. iter.head = i
  518. hasMore = false
  519. break
  520. }
  521. if !hasMore {
  522. break
  523. }
  524. }
  525. if hasMore {
  526. if !iter.loadMore() {
  527. break
  528. }
  529. }
  530. }
  531. if iter.Error != nil && iter.Error != io.EOF {
  532. return
  533. }
  534. number := *(*string)(unsafe.Pointer(&str))
  535. if foundFloat {
  536. val, err := strconv.ParseFloat(number, 64)
  537. if err != nil {
  538. iter.Error = err
  539. return
  540. }
  541. return MakeAny(val)
  542. }
  543. if foundNegative {
  544. val, err := strconv.ParseInt(number, 10, 64)
  545. if err != nil {
  546. iter.Error = err
  547. return
  548. }
  549. return MakeAny(val)
  550. }
  551. val, err := strconv.ParseUint(number, 10, 64)
  552. if err != nil {
  553. iter.Error = err
  554. return
  555. }
  556. return MakeAny(val)
  557. }
  558. // Read converts an Iterator instance into go interface, same as json.Unmarshal
  559. func (iter *Iterator) Read(obj interface{}) {
  560. typ := reflect.TypeOf(obj)
  561. cacheKey := typ.Elem()
  562. cachedDecoder := getDecoderFromCache(cacheKey)
  563. if cachedDecoder == nil {
  564. decoder, err := decoderOfType(typ)
  565. if err != nil {
  566. iter.Error = err
  567. return
  568. }
  569. cachedDecoder = decoder
  570. addDecoderToCache(cacheKey, decoder)
  571. }
  572. e := (*emptyInterface)(unsafe.Pointer(&obj))
  573. cachedDecoder.decode(e.word, iter)
  574. }
  575. type prefix string
  576. func (p prefix) addTo(decoder Decoder, err error) (Decoder, error) {
  577. if err != nil {
  578. return nil, fmt.Errorf("%s: %s", p, err.Error())
  579. }
  580. return decoder, err
  581. }
  582. func decoderOfType(typ reflect.Type) (Decoder, error) {
  583. switch typ.Kind() {
  584. case reflect.Ptr:
  585. return prefix("ptr").addTo(decoderOfPtr(typ.Elem()))
  586. default:
  587. return nil, errors.New("expect ptr")
  588. }
  589. }
  590. func decoderOfPtr(typ reflect.Type) (Decoder, error) {
  591. typeName := typ.String()
  592. if typeName == "jsoniter.Any" {
  593. return &anyDecoder{}, nil
  594. }
  595. typeDecoder := typeDecoders[typeName]
  596. if typeDecoder != nil {
  597. return typeDecoder, nil
  598. }
  599. switch typ.Kind() {
  600. case reflect.String:
  601. return &stringDecoder{}, nil
  602. case reflect.Int:
  603. return &intDecoder{}, nil
  604. case reflect.Int8:
  605. return &int8Decoder{}, nil
  606. case reflect.Int16:
  607. return &int16Decoder{}, nil
  608. case reflect.Int32:
  609. return &int32Decoder{}, nil
  610. case reflect.Int64:
  611. return &int64Decoder{}, nil
  612. case reflect.Uint:
  613. return &uintDecoder{}, nil
  614. case reflect.Uint8:
  615. return &uint8Decoder{}, nil
  616. case reflect.Uint16:
  617. return &uint16Decoder{}, nil
  618. case reflect.Uint32:
  619. return &uint32Decoder{}, nil
  620. case reflect.Uint64:
  621. return &uint64Decoder{}, nil
  622. case reflect.Float32:
  623. return &float32Decoder{}, nil
  624. case reflect.Float64:
  625. return &float64Decoder{}, nil
  626. case reflect.Bool:
  627. return &boolDecoder{}, nil
  628. case reflect.Interface:
  629. return &interfaceDecoder{}, nil
  630. case reflect.Struct:
  631. return decoderOfStruct(typ)
  632. case reflect.Slice:
  633. return prefix("[slice]").addTo(decoderOfSlice(typ))
  634. case reflect.Map:
  635. return prefix("[map]").addTo(decoderOfMap(typ))
  636. case reflect.Ptr:
  637. return prefix("[optional]").addTo(decoderOfOptional(typ.Elem()))
  638. default:
  639. return nil, fmt.Errorf("unsupported type: %v", typ)
  640. }
  641. }
  642. func decoderOfOptional(typ reflect.Type) (Decoder, error) {
  643. decoder, err := decoderOfPtr(typ)
  644. if err != nil {
  645. return nil, err
  646. }
  647. return &optionalDecoder{typ, decoder}, nil
  648. }
  649. func decoderOfStruct(typ reflect.Type) (Decoder, error) {
  650. fields := map[string]*structFieldDecoder{}
  651. for i := 0; i < typ.NumField(); i++ {
  652. field := typ.Field(i)
  653. fieldDecoderKey := fmt.Sprintf("%s/%s", typ.String(), field.Name)
  654. var fieldNames []string
  655. for _, extension := range extensions {
  656. alternativeFieldNames, fun := extension(typ, &field)
  657. if alternativeFieldNames != nil {
  658. fieldNames = alternativeFieldNames
  659. }
  660. if fun != nil {
  661. fieldDecoders[fieldDecoderKey] = &funcDecoder{fun}
  662. }
  663. }
  664. decoder := fieldDecoders[fieldDecoderKey]
  665. tagParts := strings.Split(field.Tag.Get("json"), ",")
  666. // if fieldNames set by extension, use theirs, otherwise try tags
  667. if fieldNames == nil {
  668. /// tagParts[0] always present, even if no tags
  669. switch tagParts[0] {
  670. case "":
  671. fieldNames = []string{field.Name}
  672. case "-":
  673. fieldNames = []string{}
  674. default:
  675. fieldNames = []string{tagParts[0]}
  676. }
  677. }
  678. if decoder == nil {
  679. var err error
  680. decoder, err = decoderOfPtr(field.Type)
  681. if err != nil {
  682. return prefix(fmt.Sprintf("{%s}", field.Name)).addTo(decoder, err)
  683. }
  684. }
  685. if len(tagParts) > 1 && tagParts[1] == "string" {
  686. decoder = &stringNumberDecoder{decoder}
  687. }
  688. for _, fieldName := range fieldNames {
  689. fields[fieldName] = &structFieldDecoder{&field, decoder}
  690. }
  691. }
  692. switch len(fields) {
  693. case 0:
  694. return &skipDecoder{typ}, nil
  695. case 1:
  696. for fieldName, fieldDecoder := range fields {
  697. return &oneFieldStructDecoder{typ, fieldName, fieldDecoder}, nil
  698. }
  699. case 2:
  700. var fieldName1 string
  701. var fieldName2 string
  702. var fieldDecoder1 *structFieldDecoder
  703. var fieldDecoder2 *structFieldDecoder
  704. for fieldName, fieldDecoder := range fields {
  705. if fieldName1 == "" {
  706. fieldName1 = fieldName
  707. fieldDecoder1 = fieldDecoder
  708. } else {
  709. fieldName2 = fieldName
  710. fieldDecoder2 = fieldDecoder
  711. }
  712. }
  713. return &twoFieldsStructDecoder{typ, fieldName1, fieldDecoder1, fieldName2, fieldDecoder2}, nil
  714. case 3:
  715. var fieldName1 string
  716. var fieldName2 string
  717. var fieldName3 string
  718. var fieldDecoder1 *structFieldDecoder
  719. var fieldDecoder2 *structFieldDecoder
  720. var fieldDecoder3 *structFieldDecoder
  721. for fieldName, fieldDecoder := range fields {
  722. if fieldName1 == "" {
  723. fieldName1 = fieldName
  724. fieldDecoder1 = fieldDecoder
  725. } else if fieldName2 == "" {
  726. fieldName2 = fieldName
  727. fieldDecoder2 = fieldDecoder
  728. } else {
  729. fieldName3 = fieldName
  730. fieldDecoder3 = fieldDecoder
  731. }
  732. }
  733. return &threeFieldsStructDecoder{typ,
  734. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3}, nil
  735. case 4:
  736. var fieldName1 string
  737. var fieldName2 string
  738. var fieldName3 string
  739. var fieldName4 string
  740. var fieldDecoder1 *structFieldDecoder
  741. var fieldDecoder2 *structFieldDecoder
  742. var fieldDecoder3 *structFieldDecoder
  743. var fieldDecoder4 *structFieldDecoder
  744. for fieldName, fieldDecoder := range fields {
  745. if fieldName1 == "" {
  746. fieldName1 = fieldName
  747. fieldDecoder1 = fieldDecoder
  748. } else if fieldName2 == "" {
  749. fieldName2 = fieldName
  750. fieldDecoder2 = fieldDecoder
  751. } else if fieldName3 == "" {
  752. fieldName3 = fieldName
  753. fieldDecoder3 = fieldDecoder
  754. } else {
  755. fieldName4 = fieldName
  756. fieldDecoder4 = fieldDecoder
  757. }
  758. }
  759. return &fourFieldsStructDecoder{typ,
  760. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
  761. fieldName4, fieldDecoder4}, nil
  762. }
  763. return &generalStructDecoder{typ, fields}, nil
  764. }
  765. func decoderOfSlice(typ reflect.Type) (Decoder, error) {
  766. decoder, err := decoderOfPtr(typ.Elem())
  767. if err != nil {
  768. return nil, err
  769. }
  770. return &sliceDecoder{typ, typ.Elem(), decoder}, nil
  771. }
  772. func decoderOfMap(typ reflect.Type) (Decoder, error) {
  773. decoder, err := decoderOfPtr(typ.Elem())
  774. if err != nil {
  775. return nil, err
  776. }
  777. mapInterface := reflect.New(typ).Interface()
  778. return &mapDecoder{typ, typ.Elem(), decoder, *((*emptyInterface)(unsafe.Pointer(&mapInterface)))}, nil
  779. }