feature_reflect.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679
  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. return &base64Codec{}, nil
  254. }
  255. if typ.Implements(unmarshalerType) {
  256. templateInterface := reflect.New(typ).Elem().Interface()
  257. var decoder ValDecoder = &unmarshalerDecoder{extractInterface(templateInterface)}
  258. if typ.Kind() == reflect.Ptr {
  259. decoder = &optionalDecoder{typ.Elem(), decoder}
  260. }
  261. return decoder, nil
  262. }
  263. if reflect.PtrTo(typ).Implements(unmarshalerType) {
  264. templateInterface := reflect.New(typ).Interface()
  265. var decoder ValDecoder = &unmarshalerDecoder{extractInterface(templateInterface)}
  266. return decoder, nil
  267. }
  268. if typ.Implements(textUnmarshalerType) {
  269. templateInterface := reflect.New(typ).Elem().Interface()
  270. var decoder ValDecoder = &textUnmarshalerDecoder{extractInterface(templateInterface)}
  271. if typ.Kind() == reflect.Ptr {
  272. decoder = &optionalDecoder{typ.Elem(), decoder}
  273. }
  274. return decoder, nil
  275. }
  276. if reflect.PtrTo(typ).Implements(textUnmarshalerType) {
  277. templateInterface := reflect.New(typ).Interface()
  278. var decoder ValDecoder = &textUnmarshalerDecoder{extractInterface(templateInterface)}
  279. return decoder, nil
  280. }
  281. if typ.Implements(anyType) {
  282. return &anyCodec{}, nil
  283. }
  284. switch typ.Kind() {
  285. case reflect.String:
  286. if typeName != "string" {
  287. return decoderOfType(cfg, reflect.TypeOf((*string)(nil)).Elem())
  288. }
  289. return &stringCodec{}, nil
  290. case reflect.Int:
  291. if typeName != "int" {
  292. return decoderOfType(cfg, reflect.TypeOf((*int)(nil)).Elem())
  293. }
  294. return &intCodec{}, nil
  295. case reflect.Int8:
  296. if typeName != "int8" {
  297. return decoderOfType(cfg, reflect.TypeOf((*int8)(nil)).Elem())
  298. }
  299. return &int8Codec{}, nil
  300. case reflect.Int16:
  301. if typeName != "int16" {
  302. return decoderOfType(cfg, reflect.TypeOf((*int16)(nil)).Elem())
  303. }
  304. return &int16Codec{}, nil
  305. case reflect.Int32:
  306. if typeName != "int32" {
  307. return decoderOfType(cfg, reflect.TypeOf((*int32)(nil)).Elem())
  308. }
  309. return &int32Codec{}, nil
  310. case reflect.Int64:
  311. if typeName != "int64" {
  312. return decoderOfType(cfg, reflect.TypeOf((*int64)(nil)).Elem())
  313. }
  314. return &int64Codec{}, nil
  315. case reflect.Uint:
  316. if typeName != "uint" {
  317. return decoderOfType(cfg, reflect.TypeOf((*uint)(nil)).Elem())
  318. }
  319. return &uintCodec{}, nil
  320. case reflect.Uint8:
  321. if typeName != "uint8" {
  322. return decoderOfType(cfg, reflect.TypeOf((*uint8)(nil)).Elem())
  323. }
  324. return &uint8Codec{}, nil
  325. case reflect.Uint16:
  326. if typeName != "uint16" {
  327. return decoderOfType(cfg, reflect.TypeOf((*uint16)(nil)).Elem())
  328. }
  329. return &uint16Codec{}, nil
  330. case reflect.Uint32:
  331. if typeName != "uint32" {
  332. return decoderOfType(cfg, reflect.TypeOf((*uint32)(nil)).Elem())
  333. }
  334. return &uint32Codec{}, nil
  335. case reflect.Uintptr:
  336. if typeName != "uintptr" {
  337. return decoderOfType(cfg, reflect.TypeOf((*uintptr)(nil)).Elem())
  338. }
  339. return &uintptrCodec{}, nil
  340. case reflect.Uint64:
  341. if typeName != "uint64" {
  342. return decoderOfType(cfg, reflect.TypeOf((*uint64)(nil)).Elem())
  343. }
  344. return &uint64Codec{}, nil
  345. case reflect.Float32:
  346. if typeName != "float32" {
  347. return decoderOfType(cfg, reflect.TypeOf((*float32)(nil)).Elem())
  348. }
  349. return &float32Codec{}, nil
  350. case reflect.Float64:
  351. if typeName != "float64" {
  352. return decoderOfType(cfg, reflect.TypeOf((*float64)(nil)).Elem())
  353. }
  354. return &float64Codec{}, nil
  355. case reflect.Bool:
  356. if typeName != "bool" {
  357. return decoderOfType(cfg, reflect.TypeOf((*bool)(nil)).Elem())
  358. }
  359. return &boolCodec{}, nil
  360. case reflect.Interface:
  361. if typ.NumMethod() == 0 {
  362. return &emptyInterfaceCodec{}, nil
  363. }
  364. return &nonEmptyInterfaceCodec{}, nil
  365. case reflect.Struct:
  366. return prefix(fmt.Sprintf("[%s]", typeName)).addToDecoder(decoderOfStruct(cfg, typ))
  367. case reflect.Array:
  368. return prefix("[array]").addToDecoder(decoderOfArray(cfg, typ))
  369. case reflect.Slice:
  370. return prefix("[slice]").addToDecoder(decoderOfSlice(cfg, typ))
  371. case reflect.Map:
  372. return prefix("[map]").addToDecoder(decoderOfMap(cfg, typ))
  373. case reflect.Ptr:
  374. return prefix("[optional]").addToDecoder(decoderOfOptional(cfg, typ))
  375. default:
  376. return nil, fmt.Errorf("unsupported type: %v", typ)
  377. }
  378. }
  379. func encoderOfType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  380. cacheKey := typ
  381. encoder := cfg.getEncoderFromCache(cacheKey)
  382. if encoder != nil {
  383. return encoder, nil
  384. }
  385. encoder = getTypeEncoderFromExtension(typ)
  386. if encoder != nil {
  387. cfg.addEncoderToCache(cacheKey, encoder)
  388. return encoder, nil
  389. }
  390. encoder = &placeholderEncoder{cfg: cfg, cacheKey: cacheKey}
  391. cfg.addEncoderToCache(cacheKey, encoder)
  392. encoder, err := createEncoderOfType(cfg, typ)
  393. for _, extension := range extensions {
  394. encoder = extension.DecorateEncoder(typ, encoder)
  395. }
  396. cfg.addEncoderToCache(cacheKey, encoder)
  397. return encoder, err
  398. }
  399. func createEncoderOfType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  400. if typ == jsonRawMessageType {
  401. return &jsonRawMessageCodec{}, nil
  402. }
  403. if typ == jsoniterRawMessageType {
  404. return &jsoniterRawMessageCodec{}, nil
  405. }
  406. if typ.AssignableTo(jsonNumberType) {
  407. return &jsonNumberCodec{}, nil
  408. }
  409. if typ.Kind() == reflect.Slice && typ.Elem().Kind() == reflect.Uint8 {
  410. return &base64Codec{typ}, nil
  411. }
  412. if typ.Implements(marshalerType) {
  413. checkIsEmpty, err := createCheckIsEmpty(typ)
  414. if err != nil {
  415. return nil, err
  416. }
  417. templateInterface := reflect.New(typ).Elem().Interface()
  418. var encoder ValEncoder = &marshalerEncoder{
  419. templateInterface: extractInterface(templateInterface),
  420. checkIsEmpty: checkIsEmpty,
  421. }
  422. if typ.Kind() == reflect.Ptr {
  423. encoder = &optionalEncoder{encoder}
  424. }
  425. return encoder, nil
  426. }
  427. if typ.Implements(textMarshalerType) {
  428. checkIsEmpty, err := createCheckIsEmpty(typ)
  429. if err != nil {
  430. return nil, err
  431. }
  432. templateInterface := reflect.New(typ).Elem().Interface()
  433. var encoder ValEncoder = &textMarshalerEncoder{
  434. templateInterface: extractInterface(templateInterface),
  435. checkIsEmpty: checkIsEmpty,
  436. }
  437. if typ.Kind() == reflect.Ptr {
  438. encoder = &optionalEncoder{encoder}
  439. }
  440. return encoder, nil
  441. }
  442. if typ.Implements(anyType) {
  443. return &anyCodec{}, nil
  444. }
  445. return createEncoderOfSimpleType(cfg, typ)
  446. }
  447. func createCheckIsEmpty(typ reflect.Type) (checkIsEmpty, error) {
  448. kind := typ.Kind()
  449. switch kind {
  450. case reflect.String:
  451. return &stringCodec{}, nil
  452. case reflect.Int:
  453. return &intCodec{}, nil
  454. case reflect.Int8:
  455. return &int8Codec{}, nil
  456. case reflect.Int16:
  457. return &int16Codec{}, nil
  458. case reflect.Int32:
  459. return &int32Codec{}, nil
  460. case reflect.Int64:
  461. return &int64Codec{}, nil
  462. case reflect.Uint:
  463. return &uintCodec{}, nil
  464. case reflect.Uint8:
  465. return &uint8Codec{}, nil
  466. case reflect.Uint16:
  467. return &uint16Codec{}, nil
  468. case reflect.Uint32:
  469. return &uint32Codec{}, nil
  470. case reflect.Uintptr:
  471. return &uintptrCodec{}, nil
  472. case reflect.Uint64:
  473. return &uint64Codec{}, nil
  474. case reflect.Float32:
  475. return &float32Codec{}, nil
  476. case reflect.Float64:
  477. return &float64Codec{}, nil
  478. case reflect.Bool:
  479. return &boolCodec{}, nil
  480. case reflect.Interface:
  481. if typ.NumMethod() == 0 {
  482. return &emptyInterfaceCodec{}, nil
  483. }
  484. return &nonEmptyInterfaceCodec{}, nil
  485. case reflect.Struct:
  486. return &structEncoder{}, nil
  487. case reflect.Array:
  488. return &arrayEncoder{}, nil
  489. case reflect.Slice:
  490. return &sliceEncoder{}, nil
  491. case reflect.Map:
  492. return &mapEncoder{}, nil
  493. case reflect.Ptr:
  494. return &optionalEncoder{}, nil
  495. default:
  496. return nil, fmt.Errorf("unsupported type: %v", typ)
  497. }
  498. }
  499. func createEncoderOfSimpleType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  500. typeName := typ.String()
  501. kind := typ.Kind()
  502. switch kind {
  503. case reflect.String:
  504. if typeName != "string" {
  505. return encoderOfType(cfg, reflect.TypeOf((*string)(nil)).Elem())
  506. }
  507. return &stringCodec{}, nil
  508. case reflect.Int:
  509. if typeName != "int" {
  510. return encoderOfType(cfg, reflect.TypeOf((*int)(nil)).Elem())
  511. }
  512. return &intCodec{}, nil
  513. case reflect.Int8:
  514. if typeName != "int8" {
  515. return encoderOfType(cfg, reflect.TypeOf((*int8)(nil)).Elem())
  516. }
  517. return &int8Codec{}, nil
  518. case reflect.Int16:
  519. if typeName != "int16" {
  520. return encoderOfType(cfg, reflect.TypeOf((*int16)(nil)).Elem())
  521. }
  522. return &int16Codec{}, nil
  523. case reflect.Int32:
  524. if typeName != "int32" {
  525. return encoderOfType(cfg, reflect.TypeOf((*int32)(nil)).Elem())
  526. }
  527. return &int32Codec{}, nil
  528. case reflect.Int64:
  529. if typeName != "int64" {
  530. return encoderOfType(cfg, reflect.TypeOf((*int64)(nil)).Elem())
  531. }
  532. return &int64Codec{}, nil
  533. case reflect.Uint:
  534. if typeName != "uint" {
  535. return encoderOfType(cfg, reflect.TypeOf((*uint)(nil)).Elem())
  536. }
  537. return &uintCodec{}, nil
  538. case reflect.Uint8:
  539. if typeName != "uint8" {
  540. return encoderOfType(cfg, reflect.TypeOf((*uint8)(nil)).Elem())
  541. }
  542. return &uint8Codec{}, nil
  543. case reflect.Uint16:
  544. if typeName != "uint16" {
  545. return encoderOfType(cfg, reflect.TypeOf((*uint16)(nil)).Elem())
  546. }
  547. return &uint16Codec{}, nil
  548. case reflect.Uint32:
  549. if typeName != "uint32" {
  550. return encoderOfType(cfg, reflect.TypeOf((*uint32)(nil)).Elem())
  551. }
  552. return &uint32Codec{}, nil
  553. case reflect.Uintptr:
  554. if typeName != "uintptr" {
  555. return encoderOfType(cfg, reflect.TypeOf((*uintptr)(nil)).Elem())
  556. }
  557. return &uintptrCodec{}, nil
  558. case reflect.Uint64:
  559. if typeName != "uint64" {
  560. return encoderOfType(cfg, reflect.TypeOf((*uint64)(nil)).Elem())
  561. }
  562. return &uint64Codec{}, nil
  563. case reflect.Float32:
  564. if typeName != "float32" {
  565. return encoderOfType(cfg, reflect.TypeOf((*float32)(nil)).Elem())
  566. }
  567. return &float32Codec{}, nil
  568. case reflect.Float64:
  569. if typeName != "float64" {
  570. return encoderOfType(cfg, reflect.TypeOf((*float64)(nil)).Elem())
  571. }
  572. return &float64Codec{}, nil
  573. case reflect.Bool:
  574. if typeName != "bool" {
  575. return encoderOfType(cfg, reflect.TypeOf((*bool)(nil)).Elem())
  576. }
  577. return &boolCodec{}, nil
  578. case reflect.Interface:
  579. if typ.NumMethod() == 0 {
  580. return &emptyInterfaceCodec{}, nil
  581. }
  582. return &nonEmptyInterfaceCodec{}, nil
  583. case reflect.Struct:
  584. return prefix(fmt.Sprintf("[%s]", typeName)).addToEncoder(encoderOfStruct(cfg, typ))
  585. case reflect.Array:
  586. return prefix("[array]").addToEncoder(encoderOfArray(cfg, typ))
  587. case reflect.Slice:
  588. return prefix("[slice]").addToEncoder(encoderOfSlice(cfg, typ))
  589. case reflect.Map:
  590. return prefix("[map]").addToEncoder(encoderOfMap(cfg, typ))
  591. case reflect.Ptr:
  592. return prefix("[optional]").addToEncoder(encoderOfOptional(cfg, typ))
  593. default:
  594. return nil, fmt.Errorf("unsupported type: %v", typ)
  595. }
  596. }
  597. func decoderOfOptional(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) {
  598. elemType := typ.Elem()
  599. decoder, err := decoderOfType(cfg, elemType)
  600. if err != nil {
  601. return nil, err
  602. }
  603. return &optionalDecoder{elemType, decoder}, nil
  604. }
  605. func encoderOfOptional(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  606. elemType := typ.Elem()
  607. elemEncoder, err := encoderOfType(cfg, elemType)
  608. if err != nil {
  609. return nil, err
  610. }
  611. encoder := &optionalEncoder{elemEncoder}
  612. if elemType.Kind() == reflect.Map {
  613. encoder = &optionalEncoder{encoder}
  614. }
  615. return encoder, nil
  616. }
  617. func decoderOfMap(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) {
  618. decoder, err := decoderOfType(cfg, typ.Elem())
  619. if err != nil {
  620. return nil, err
  621. }
  622. mapInterface := reflect.New(typ).Interface()
  623. return &mapDecoder{typ, typ.Key(), typ.Elem(), decoder, extractInterface(mapInterface)}, nil
  624. }
  625. func extractInterface(val interface{}) emptyInterface {
  626. return *((*emptyInterface)(unsafe.Pointer(&val)))
  627. }
  628. func encoderOfMap(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  629. elemType := typ.Elem()
  630. encoder, err := encoderOfType(cfg, elemType)
  631. if err != nil {
  632. return nil, err
  633. }
  634. mapInterface := reflect.New(typ).Elem().Interface()
  635. if cfg.sortMapKeys {
  636. return &sortKeysMapEncoder{typ, elemType, encoder, *((*emptyInterface)(unsafe.Pointer(&mapInterface)))}, nil
  637. }
  638. return &mapEncoder{typ, elemType, encoder, *((*emptyInterface)(unsafe.Pointer(&mapInterface)))}, nil
  639. }