feature_reflect.go 22 KB

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