feature_reflect.go 20 KB

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