feature_reflect.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683
  1. package jsoniter
  2. import (
  3. "encoding"
  4. "encoding/json"
  5. "fmt"
  6. "reflect"
  7. "time"
  8. "unsafe"
  9. )
  10. // ValDecoder is an internal type registered to cache as needed.
  11. // Don't confuse jsoniter.ValDecoder with json.Decoder.
  12. // For json.Decoder's adapter, refer to jsoniter.AdapterDecoder(todo link).
  13. //
  14. // Reflection on type to create decoders, which is then cached
  15. // Reflection on value is avoided as we can, as the reflect.Value itself will allocate, with following exceptions
  16. // 1. create instance of new value, for example *int will need a int to be allocated
  17. // 2. append to slice, if the existing cap is not enough, allocate will be done using Reflect.New
  18. // 3. assignment to map, both key and value will be reflect.Value
  19. // For a simple struct binding, it will be reflect.Value free and allocation free
  20. type ValDecoder interface {
  21. Decode(ptr unsafe.Pointer, iter *Iterator)
  22. }
  23. // ValEncoder is an internal type registered to cache as needed.
  24. // Don't confuse jsoniter.ValEncoder with json.Encoder.
  25. // For json.Encoder's adapter, refer to jsoniter.AdapterEncoder(todo godoc link).
  26. type ValEncoder interface {
  27. IsEmpty(ptr unsafe.Pointer) bool
  28. Encode(ptr unsafe.Pointer, stream *Stream)
  29. EncodeInterface(val interface{}, stream *Stream)
  30. }
  31. type checkIsEmpty interface {
  32. IsEmpty(ptr unsafe.Pointer) bool
  33. }
  34. // WriteToStream the default implementation for TypeEncoder method EncodeInterface
  35. func WriteToStream(val interface{}, stream *Stream, encoder ValEncoder) {
  36. e := (*emptyInterface)(unsafe.Pointer(&val))
  37. if e.word == nil {
  38. stream.WriteNil()
  39. return
  40. }
  41. if reflect.TypeOf(val).Kind() == reflect.Ptr {
  42. encoder.Encode(unsafe.Pointer(&e.word), stream)
  43. } else {
  44. encoder.Encode(e.word, stream)
  45. }
  46. }
  47. var jsonNumberType reflect.Type
  48. var jsonRawMessageType reflect.Type
  49. var jsoniterRawMessageType reflect.Type
  50. var anyType reflect.Type
  51. var marshalerType reflect.Type
  52. var unmarshalerType reflect.Type
  53. var textMarshalerType reflect.Type
  54. var textUnmarshalerType reflect.Type
  55. func init() {
  56. jsonNumberType = reflect.TypeOf((*json.Number)(nil)).Elem()
  57. jsonRawMessageType = reflect.TypeOf((*json.RawMessage)(nil)).Elem()
  58. jsoniterRawMessageType = reflect.TypeOf((*RawMessage)(nil)).Elem()
  59. anyType = reflect.TypeOf((*Any)(nil)).Elem()
  60. marshalerType = reflect.TypeOf((*json.Marshaler)(nil)).Elem()
  61. unmarshalerType = reflect.TypeOf((*json.Unmarshaler)(nil)).Elem()
  62. textMarshalerType = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem()
  63. textUnmarshalerType = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem()
  64. }
  65. type optionalDecoder struct {
  66. valueType reflect.Type
  67. valueDecoder ValDecoder
  68. }
  69. func (decoder *optionalDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  70. if iter.ReadNil() {
  71. *((*unsafe.Pointer)(ptr)) = nil
  72. } else {
  73. if *((*unsafe.Pointer)(ptr)) == nil {
  74. //pointer to null, we have to allocate memory to hold the value
  75. value := reflect.New(decoder.valueType)
  76. newPtr := extractInterface(value.Interface()).word
  77. decoder.valueDecoder.Decode(newPtr, iter)
  78. *((*uintptr)(ptr)) = uintptr(newPtr)
  79. } else {
  80. //reuse existing instance
  81. decoder.valueDecoder.Decode(*((*unsafe.Pointer)(ptr)), iter)
  82. }
  83. }
  84. }
  85. type deferenceDecoder struct {
  86. // only to deference a pointer
  87. valueType reflect.Type
  88. valueDecoder ValDecoder
  89. }
  90. func (decoder *deferenceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  91. if *((*unsafe.Pointer)(ptr)) == nil {
  92. //pointer to null, we have to allocate memory to hold the value
  93. value := reflect.New(decoder.valueType)
  94. newPtr := extractInterface(value.Interface()).word
  95. decoder.valueDecoder.Decode(newPtr, iter)
  96. *((*uintptr)(ptr)) = uintptr(newPtr)
  97. } else {
  98. //reuse existing instance
  99. decoder.valueDecoder.Decode(*((*unsafe.Pointer)(ptr)), iter)
  100. }
  101. }
  102. type optionalEncoder struct {
  103. valueEncoder ValEncoder
  104. }
  105. func (encoder *optionalEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
  106. if *((*unsafe.Pointer)(ptr)) == nil {
  107. stream.WriteNil()
  108. } else {
  109. encoder.valueEncoder.Encode(*((*unsafe.Pointer)(ptr)), stream)
  110. }
  111. }
  112. func (encoder *optionalEncoder) EncodeInterface(val interface{}, stream *Stream) {
  113. WriteToStream(val, stream, encoder)
  114. }
  115. func (encoder *optionalEncoder) IsEmpty(ptr unsafe.Pointer) bool {
  116. if *((*unsafe.Pointer)(ptr)) == nil {
  117. return true
  118. }
  119. return false
  120. }
  121. type placeholderEncoder struct {
  122. cfg *frozenConfig
  123. cacheKey reflect.Type
  124. }
  125. func (encoder *placeholderEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
  126. encoder.getRealEncoder().Encode(ptr, stream)
  127. }
  128. func (encoder *placeholderEncoder) EncodeInterface(val interface{}, stream *Stream) {
  129. WriteToStream(val, stream, encoder)
  130. }
  131. func (encoder *placeholderEncoder) IsEmpty(ptr unsafe.Pointer) bool {
  132. return encoder.getRealEncoder().IsEmpty(ptr)
  133. }
  134. func (encoder *placeholderEncoder) getRealEncoder() ValEncoder {
  135. for i := 0; i < 30; i++ {
  136. realDecoder := encoder.cfg.getEncoderFromCache(encoder.cacheKey)
  137. _, isPlaceholder := realDecoder.(*placeholderEncoder)
  138. if isPlaceholder {
  139. time.Sleep(time.Second)
  140. } else {
  141. return realDecoder
  142. }
  143. }
  144. panic(fmt.Sprintf("real encoder not found for cache key: %v", encoder.cacheKey))
  145. }
  146. type placeholderDecoder struct {
  147. cfg *frozenConfig
  148. cacheKey reflect.Type
  149. }
  150. func (decoder *placeholderDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  151. for i := 0; i < 30; i++ {
  152. realDecoder := decoder.cfg.getDecoderFromCache(decoder.cacheKey)
  153. _, isPlaceholder := realDecoder.(*placeholderDecoder)
  154. if isPlaceholder {
  155. time.Sleep(time.Second)
  156. } else {
  157. realDecoder.Decode(ptr, iter)
  158. return
  159. }
  160. }
  161. panic(fmt.Sprintf("real decoder not found for cache key: %v", decoder.cacheKey))
  162. }
  163. // emptyInterface is the header for an interface{} value.
  164. type emptyInterface struct {
  165. typ unsafe.Pointer
  166. word unsafe.Pointer
  167. }
  168. // emptyInterface is the header for an interface with method (not interface{})
  169. type nonEmptyInterface struct {
  170. // see ../runtime/iface.go:/Itab
  171. itab *struct {
  172. ityp unsafe.Pointer // static interface type
  173. typ unsafe.Pointer // dynamic concrete type
  174. link unsafe.Pointer
  175. bad int32
  176. unused int32
  177. fun [100000]unsafe.Pointer // method table
  178. }
  179. word unsafe.Pointer
  180. }
  181. // ReadVal copy the underlying JSON into go interface, same as json.Unmarshal
  182. func (iter *Iterator) ReadVal(obj interface{}) {
  183. typ := reflect.TypeOf(obj)
  184. cacheKey := typ.Elem()
  185. decoder, err := decoderOfType(iter.cfg, cacheKey)
  186. if err != nil {
  187. iter.Error = err
  188. return
  189. }
  190. e := (*emptyInterface)(unsafe.Pointer(&obj))
  191. decoder.Decode(e.word, iter)
  192. }
  193. // WriteVal copy the go interface into underlying JSON, same as json.Marshal
  194. func (stream *Stream) WriteVal(val interface{}) {
  195. if nil == val {
  196. stream.WriteNil()
  197. return
  198. }
  199. typ := reflect.TypeOf(val)
  200. cacheKey := typ
  201. encoder, err := encoderOfType(stream.cfg, cacheKey)
  202. if err != nil {
  203. stream.Error = err
  204. return
  205. }
  206. encoder.EncodeInterface(val, stream)
  207. }
  208. type prefix string
  209. func (p prefix) addToDecoder(decoder ValDecoder, err error) (ValDecoder, error) {
  210. if err != nil {
  211. return nil, fmt.Errorf("%s: %s", p, err.Error())
  212. }
  213. return decoder, err
  214. }
  215. func (p prefix) addToEncoder(encoder ValEncoder, err error) (ValEncoder, error) {
  216. if err != nil {
  217. return nil, fmt.Errorf("%s: %s", p, err.Error())
  218. }
  219. return encoder, err
  220. }
  221. func decoderOfType(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) {
  222. cacheKey := typ
  223. decoder := cfg.getDecoderFromCache(cacheKey)
  224. if decoder != nil {
  225. return decoder, nil
  226. }
  227. decoder = getTypeDecoderFromExtension(typ)
  228. if decoder != nil {
  229. cfg.addDecoderToCache(cacheKey, decoder)
  230. return decoder, nil
  231. }
  232. decoder = &placeholderDecoder{cfg: cfg, cacheKey: cacheKey}
  233. cfg.addDecoderToCache(cacheKey, decoder)
  234. decoder, err := createDecoderOfType(cfg, typ)
  235. for _, extension := range extensions {
  236. decoder = extension.DecorateDecoder(typ, decoder)
  237. }
  238. cfg.addDecoderToCache(cacheKey, decoder)
  239. return decoder, err
  240. }
  241. func createDecoderOfType(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) {
  242. typeName := typ.String()
  243. if typ == jsonRawMessageType {
  244. return &jsonRawMessageCodec{}, nil
  245. }
  246. if typ == jsoniterRawMessageType {
  247. return &jsoniterRawMessageCodec{}, nil
  248. }
  249. if typ.AssignableTo(jsonNumberType) {
  250. return &jsonNumberCodec{}, nil
  251. }
  252. if typ.Kind() == reflect.Slice && typ.Elem().Kind() == reflect.Uint8 {
  253. sliceDecoder, err := prefix("[slice]").addToDecoder(decoderOfSlice(cfg, typ))
  254. if err != nil {
  255. return nil, err
  256. }
  257. return &base64Codec{sliceDecoder: sliceDecoder}, nil
  258. }
  259. if typ.Implements(unmarshalerType) {
  260. templateInterface := reflect.New(typ).Elem().Interface()
  261. var decoder ValDecoder = &unmarshalerDecoder{extractInterface(templateInterface)}
  262. if typ.Kind() == reflect.Ptr {
  263. decoder = &optionalDecoder{typ.Elem(), decoder}
  264. }
  265. return decoder, nil
  266. }
  267. if reflect.PtrTo(typ).Implements(unmarshalerType) {
  268. templateInterface := reflect.New(typ).Interface()
  269. var decoder ValDecoder = &unmarshalerDecoder{extractInterface(templateInterface)}
  270. return decoder, nil
  271. }
  272. if typ.Implements(textUnmarshalerType) {
  273. templateInterface := reflect.New(typ).Elem().Interface()
  274. var decoder ValDecoder = &textUnmarshalerDecoder{extractInterface(templateInterface)}
  275. if typ.Kind() == reflect.Ptr {
  276. decoder = &optionalDecoder{typ.Elem(), decoder}
  277. }
  278. return decoder, nil
  279. }
  280. if reflect.PtrTo(typ).Implements(textUnmarshalerType) {
  281. templateInterface := reflect.New(typ).Interface()
  282. var decoder ValDecoder = &textUnmarshalerDecoder{extractInterface(templateInterface)}
  283. return decoder, nil
  284. }
  285. if typ.Implements(anyType) {
  286. return &anyCodec{}, nil
  287. }
  288. switch typ.Kind() {
  289. case reflect.String:
  290. if typeName != "string" {
  291. return decoderOfType(cfg, reflect.TypeOf((*string)(nil)).Elem())
  292. }
  293. return &stringCodec{}, nil
  294. case reflect.Int:
  295. if typeName != "int" {
  296. return decoderOfType(cfg, reflect.TypeOf((*int)(nil)).Elem())
  297. }
  298. return &intCodec{}, nil
  299. case reflect.Int8:
  300. if typeName != "int8" {
  301. return decoderOfType(cfg, reflect.TypeOf((*int8)(nil)).Elem())
  302. }
  303. return &int8Codec{}, nil
  304. case reflect.Int16:
  305. if typeName != "int16" {
  306. return decoderOfType(cfg, reflect.TypeOf((*int16)(nil)).Elem())
  307. }
  308. return &int16Codec{}, nil
  309. case reflect.Int32:
  310. if typeName != "int32" {
  311. return decoderOfType(cfg, reflect.TypeOf((*int32)(nil)).Elem())
  312. }
  313. return &int32Codec{}, nil
  314. case reflect.Int64:
  315. if typeName != "int64" {
  316. return decoderOfType(cfg, reflect.TypeOf((*int64)(nil)).Elem())
  317. }
  318. return &int64Codec{}, nil
  319. case reflect.Uint:
  320. if typeName != "uint" {
  321. return decoderOfType(cfg, reflect.TypeOf((*uint)(nil)).Elem())
  322. }
  323. return &uintCodec{}, nil
  324. case reflect.Uint8:
  325. if typeName != "uint8" {
  326. return decoderOfType(cfg, reflect.TypeOf((*uint8)(nil)).Elem())
  327. }
  328. return &uint8Codec{}, nil
  329. case reflect.Uint16:
  330. if typeName != "uint16" {
  331. return decoderOfType(cfg, reflect.TypeOf((*uint16)(nil)).Elem())
  332. }
  333. return &uint16Codec{}, nil
  334. case reflect.Uint32:
  335. if typeName != "uint32" {
  336. return decoderOfType(cfg, reflect.TypeOf((*uint32)(nil)).Elem())
  337. }
  338. return &uint32Codec{}, nil
  339. case reflect.Uintptr:
  340. if typeName != "uintptr" {
  341. return decoderOfType(cfg, reflect.TypeOf((*uintptr)(nil)).Elem())
  342. }
  343. return &uintptrCodec{}, nil
  344. case reflect.Uint64:
  345. if typeName != "uint64" {
  346. return decoderOfType(cfg, reflect.TypeOf((*uint64)(nil)).Elem())
  347. }
  348. return &uint64Codec{}, nil
  349. case reflect.Float32:
  350. if typeName != "float32" {
  351. return decoderOfType(cfg, reflect.TypeOf((*float32)(nil)).Elem())
  352. }
  353. return &float32Codec{}, nil
  354. case reflect.Float64:
  355. if typeName != "float64" {
  356. return decoderOfType(cfg, reflect.TypeOf((*float64)(nil)).Elem())
  357. }
  358. return &float64Codec{}, nil
  359. case reflect.Bool:
  360. if typeName != "bool" {
  361. return decoderOfType(cfg, reflect.TypeOf((*bool)(nil)).Elem())
  362. }
  363. return &boolCodec{}, nil
  364. case reflect.Interface:
  365. if typ.NumMethod() == 0 {
  366. return &emptyInterfaceCodec{}, nil
  367. }
  368. return &nonEmptyInterfaceCodec{}, nil
  369. case reflect.Struct:
  370. return prefix(fmt.Sprintf("[%s]", typeName)).addToDecoder(decoderOfStruct(cfg, typ))
  371. case reflect.Array:
  372. return prefix("[array]").addToDecoder(decoderOfArray(cfg, typ))
  373. case reflect.Slice:
  374. return prefix("[slice]").addToDecoder(decoderOfSlice(cfg, typ))
  375. case reflect.Map:
  376. return prefix("[map]").addToDecoder(decoderOfMap(cfg, typ))
  377. case reflect.Ptr:
  378. return prefix("[optional]").addToDecoder(decoderOfOptional(cfg, typ))
  379. default:
  380. return nil, fmt.Errorf("unsupported type: %v", typ)
  381. }
  382. }
  383. func encoderOfType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  384. cacheKey := typ
  385. encoder := cfg.getEncoderFromCache(cacheKey)
  386. if encoder != nil {
  387. return encoder, nil
  388. }
  389. encoder = getTypeEncoderFromExtension(typ)
  390. if encoder != nil {
  391. cfg.addEncoderToCache(cacheKey, encoder)
  392. return encoder, nil
  393. }
  394. encoder = &placeholderEncoder{cfg: cfg, cacheKey: cacheKey}
  395. cfg.addEncoderToCache(cacheKey, encoder)
  396. encoder, err := createEncoderOfType(cfg, typ)
  397. for _, extension := range extensions {
  398. encoder = extension.DecorateEncoder(typ, encoder)
  399. }
  400. cfg.addEncoderToCache(cacheKey, encoder)
  401. return encoder, err
  402. }
  403. func createEncoderOfType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  404. if typ == jsonRawMessageType {
  405. return &jsonRawMessageCodec{}, nil
  406. }
  407. if typ == jsoniterRawMessageType {
  408. return &jsoniterRawMessageCodec{}, nil
  409. }
  410. if typ.AssignableTo(jsonNumberType) {
  411. return &jsonNumberCodec{}, nil
  412. }
  413. if typ.Kind() == reflect.Slice && typ.Elem().Kind() == reflect.Uint8 {
  414. return &base64Codec{}, nil
  415. }
  416. if typ.Implements(marshalerType) {
  417. checkIsEmpty, err := createCheckIsEmpty(typ)
  418. if err != nil {
  419. return nil, err
  420. }
  421. templateInterface := reflect.New(typ).Elem().Interface()
  422. var encoder ValEncoder = &marshalerEncoder{
  423. templateInterface: extractInterface(templateInterface),
  424. checkIsEmpty: checkIsEmpty,
  425. }
  426. if typ.Kind() == reflect.Ptr {
  427. encoder = &optionalEncoder{encoder}
  428. }
  429. return encoder, nil
  430. }
  431. if typ.Implements(textMarshalerType) {
  432. checkIsEmpty, err := createCheckIsEmpty(typ)
  433. if err != nil {
  434. return nil, err
  435. }
  436. templateInterface := reflect.New(typ).Elem().Interface()
  437. var encoder ValEncoder = &textMarshalerEncoder{
  438. templateInterface: extractInterface(templateInterface),
  439. checkIsEmpty: checkIsEmpty,
  440. }
  441. if typ.Kind() == reflect.Ptr {
  442. encoder = &optionalEncoder{encoder}
  443. }
  444. return encoder, nil
  445. }
  446. if typ.Implements(anyType) {
  447. return &anyCodec{}, nil
  448. }
  449. return createEncoderOfSimpleType(cfg, typ)
  450. }
  451. func createCheckIsEmpty(typ reflect.Type) (checkIsEmpty, error) {
  452. kind := typ.Kind()
  453. switch kind {
  454. case reflect.String:
  455. return &stringCodec{}, nil
  456. case reflect.Int:
  457. return &intCodec{}, nil
  458. case reflect.Int8:
  459. return &int8Codec{}, nil
  460. case reflect.Int16:
  461. return &int16Codec{}, nil
  462. case reflect.Int32:
  463. return &int32Codec{}, nil
  464. case reflect.Int64:
  465. return &int64Codec{}, nil
  466. case reflect.Uint:
  467. return &uintCodec{}, nil
  468. case reflect.Uint8:
  469. return &uint8Codec{}, nil
  470. case reflect.Uint16:
  471. return &uint16Codec{}, nil
  472. case reflect.Uint32:
  473. return &uint32Codec{}, nil
  474. case reflect.Uintptr:
  475. return &uintptrCodec{}, nil
  476. case reflect.Uint64:
  477. return &uint64Codec{}, nil
  478. case reflect.Float32:
  479. return &float32Codec{}, nil
  480. case reflect.Float64:
  481. return &float64Codec{}, nil
  482. case reflect.Bool:
  483. return &boolCodec{}, nil
  484. case reflect.Interface:
  485. if typ.NumMethod() == 0 {
  486. return &emptyInterfaceCodec{}, nil
  487. }
  488. return &nonEmptyInterfaceCodec{}, nil
  489. case reflect.Struct:
  490. return &structEncoder{}, nil
  491. case reflect.Array:
  492. return &arrayEncoder{}, nil
  493. case reflect.Slice:
  494. return &sliceEncoder{}, nil
  495. case reflect.Map:
  496. return &mapEncoder{}, nil
  497. case reflect.Ptr:
  498. return &optionalEncoder{}, nil
  499. default:
  500. return nil, fmt.Errorf("unsupported type: %v", typ)
  501. }
  502. }
  503. func createEncoderOfSimpleType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  504. typeName := typ.String()
  505. kind := typ.Kind()
  506. switch kind {
  507. case reflect.String:
  508. if typeName != "string" {
  509. return encoderOfType(cfg, reflect.TypeOf((*string)(nil)).Elem())
  510. }
  511. return &stringCodec{}, nil
  512. case reflect.Int:
  513. if typeName != "int" {
  514. return encoderOfType(cfg, reflect.TypeOf((*int)(nil)).Elem())
  515. }
  516. return &intCodec{}, nil
  517. case reflect.Int8:
  518. if typeName != "int8" {
  519. return encoderOfType(cfg, reflect.TypeOf((*int8)(nil)).Elem())
  520. }
  521. return &int8Codec{}, nil
  522. case reflect.Int16:
  523. if typeName != "int16" {
  524. return encoderOfType(cfg, reflect.TypeOf((*int16)(nil)).Elem())
  525. }
  526. return &int16Codec{}, nil
  527. case reflect.Int32:
  528. if typeName != "int32" {
  529. return encoderOfType(cfg, reflect.TypeOf((*int32)(nil)).Elem())
  530. }
  531. return &int32Codec{}, nil
  532. case reflect.Int64:
  533. if typeName != "int64" {
  534. return encoderOfType(cfg, reflect.TypeOf((*int64)(nil)).Elem())
  535. }
  536. return &int64Codec{}, nil
  537. case reflect.Uint:
  538. if typeName != "uint" {
  539. return encoderOfType(cfg, reflect.TypeOf((*uint)(nil)).Elem())
  540. }
  541. return &uintCodec{}, nil
  542. case reflect.Uint8:
  543. if typeName != "uint8" {
  544. return encoderOfType(cfg, reflect.TypeOf((*uint8)(nil)).Elem())
  545. }
  546. return &uint8Codec{}, nil
  547. case reflect.Uint16:
  548. if typeName != "uint16" {
  549. return encoderOfType(cfg, reflect.TypeOf((*uint16)(nil)).Elem())
  550. }
  551. return &uint16Codec{}, nil
  552. case reflect.Uint32:
  553. if typeName != "uint32" {
  554. return encoderOfType(cfg, reflect.TypeOf((*uint32)(nil)).Elem())
  555. }
  556. return &uint32Codec{}, nil
  557. case reflect.Uintptr:
  558. if typeName != "uintptr" {
  559. return encoderOfType(cfg, reflect.TypeOf((*uintptr)(nil)).Elem())
  560. }
  561. return &uintptrCodec{}, nil
  562. case reflect.Uint64:
  563. if typeName != "uint64" {
  564. return encoderOfType(cfg, reflect.TypeOf((*uint64)(nil)).Elem())
  565. }
  566. return &uint64Codec{}, nil
  567. case reflect.Float32:
  568. if typeName != "float32" {
  569. return encoderOfType(cfg, reflect.TypeOf((*float32)(nil)).Elem())
  570. }
  571. return &float32Codec{}, nil
  572. case reflect.Float64:
  573. if typeName != "float64" {
  574. return encoderOfType(cfg, reflect.TypeOf((*float64)(nil)).Elem())
  575. }
  576. return &float64Codec{}, nil
  577. case reflect.Bool:
  578. if typeName != "bool" {
  579. return encoderOfType(cfg, reflect.TypeOf((*bool)(nil)).Elem())
  580. }
  581. return &boolCodec{}, nil
  582. case reflect.Interface:
  583. if typ.NumMethod() == 0 {
  584. return &emptyInterfaceCodec{}, nil
  585. }
  586. return &nonEmptyInterfaceCodec{}, nil
  587. case reflect.Struct:
  588. return prefix(fmt.Sprintf("[%s]", typeName)).addToEncoder(encoderOfStruct(cfg, typ))
  589. case reflect.Array:
  590. return prefix("[array]").addToEncoder(encoderOfArray(cfg, typ))
  591. case reflect.Slice:
  592. return prefix("[slice]").addToEncoder(encoderOfSlice(cfg, typ))
  593. case reflect.Map:
  594. return prefix("[map]").addToEncoder(encoderOfMap(cfg, typ))
  595. case reflect.Ptr:
  596. return prefix("[optional]").addToEncoder(encoderOfOptional(cfg, typ))
  597. default:
  598. return nil, fmt.Errorf("unsupported type: %v", typ)
  599. }
  600. }
  601. func decoderOfOptional(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) {
  602. elemType := typ.Elem()
  603. decoder, err := decoderOfType(cfg, elemType)
  604. if err != nil {
  605. return nil, err
  606. }
  607. return &optionalDecoder{elemType, decoder}, nil
  608. }
  609. func encoderOfOptional(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  610. elemType := typ.Elem()
  611. elemEncoder, err := encoderOfType(cfg, elemType)
  612. if err != nil {
  613. return nil, err
  614. }
  615. encoder := &optionalEncoder{elemEncoder}
  616. if elemType.Kind() == reflect.Map {
  617. encoder = &optionalEncoder{encoder}
  618. }
  619. return encoder, nil
  620. }
  621. func decoderOfMap(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) {
  622. decoder, err := decoderOfType(cfg, typ.Elem())
  623. if err != nil {
  624. return nil, err
  625. }
  626. mapInterface := reflect.New(typ).Interface()
  627. return &mapDecoder{typ, typ.Key(), typ.Elem(), decoder, extractInterface(mapInterface)}, nil
  628. }
  629. func extractInterface(val interface{}) emptyInterface {
  630. return *((*emptyInterface)(unsafe.Pointer(&val)))
  631. }
  632. func encoderOfMap(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  633. elemType := typ.Elem()
  634. encoder, err := encoderOfType(cfg, elemType)
  635. if err != nil {
  636. return nil, err
  637. }
  638. mapInterface := reflect.New(typ).Elem().Interface()
  639. if cfg.sortMapKeys {
  640. return &sortKeysMapEncoder{typ, elemType, encoder, *((*emptyInterface)(unsafe.Pointer(&mapInterface)))}, nil
  641. }
  642. return &mapEncoder{typ, elemType, encoder, *((*emptyInterface)(unsafe.Pointer(&mapInterface)))}, nil
  643. }