feature_reflect.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703
  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 < 500; i++ {
  138. realDecoder := encoder.cfg.getEncoderFromCache(encoder.cacheKey)
  139. _, isPlaceholder := realDecoder.(*placeholderEncoder)
  140. if isPlaceholder {
  141. time.Sleep(10 * time.Millisecond)
  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 < 500; i++ {
  154. realDecoder := decoder.cfg.getDecoderFromCache(decoder.cacheKey)
  155. _, isPlaceholder := realDecoder.(*placeholderDecoder)
  156. if isPlaceholder {
  157. time.Sleep(10 * time.Millisecond)
  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. return encoder, nil
  447. }
  448. if typ.Implements(textMarshalerType) {
  449. checkIsEmpty, err := createCheckIsEmpty(typ)
  450. if err != nil {
  451. return nil, err
  452. }
  453. templateInterface := reflect.New(typ).Elem().Interface()
  454. var encoder ValEncoder = &textMarshalerEncoder{
  455. templateInterface: extractInterface(templateInterface),
  456. checkIsEmpty: checkIsEmpty,
  457. }
  458. if typ.Kind() == reflect.Ptr {
  459. encoder = &optionalEncoder{encoder}
  460. }
  461. return encoder, nil
  462. }
  463. if typ.Kind() == reflect.Slice && typ.Elem().Kind() == reflect.Uint8 {
  464. return &base64Codec{}, nil
  465. }
  466. if typ.Implements(anyType) {
  467. return &anyCodec{}, nil
  468. }
  469. return createEncoderOfSimpleType(cfg, typ)
  470. }
  471. func createCheckIsEmpty(typ reflect.Type) (checkIsEmpty, error) {
  472. kind := typ.Kind()
  473. switch kind {
  474. case reflect.String:
  475. return &stringCodec{}, nil
  476. case reflect.Int:
  477. return &intCodec{}, nil
  478. case reflect.Int8:
  479. return &int8Codec{}, nil
  480. case reflect.Int16:
  481. return &int16Codec{}, nil
  482. case reflect.Int32:
  483. return &int32Codec{}, nil
  484. case reflect.Int64:
  485. return &int64Codec{}, nil
  486. case reflect.Uint:
  487. return &uintCodec{}, nil
  488. case reflect.Uint8:
  489. return &uint8Codec{}, nil
  490. case reflect.Uint16:
  491. return &uint16Codec{}, nil
  492. case reflect.Uint32:
  493. return &uint32Codec{}, nil
  494. case reflect.Uintptr:
  495. return &uintptrCodec{}, nil
  496. case reflect.Uint64:
  497. return &uint64Codec{}, nil
  498. case reflect.Float32:
  499. return &float32Codec{}, nil
  500. case reflect.Float64:
  501. return &float64Codec{}, nil
  502. case reflect.Bool:
  503. return &boolCodec{}, nil
  504. case reflect.Interface:
  505. if typ.NumMethod() == 0 {
  506. return &emptyInterfaceCodec{}, nil
  507. }
  508. return &nonEmptyInterfaceCodec{}, nil
  509. case reflect.Struct:
  510. return &structEncoder{}, nil
  511. case reflect.Array:
  512. return &arrayEncoder{}, nil
  513. case reflect.Slice:
  514. return &sliceEncoder{}, nil
  515. case reflect.Map:
  516. return &mapEncoder{}, nil
  517. case reflect.Ptr:
  518. return &optionalEncoder{}, nil
  519. default:
  520. return nil, fmt.Errorf("unsupported type: %v", typ)
  521. }
  522. }
  523. func createEncoderOfSimpleType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  524. typeName := typ.String()
  525. kind := typ.Kind()
  526. switch kind {
  527. case reflect.String:
  528. if typeName != "string" {
  529. return encoderOfType(cfg, reflect.TypeOf((*string)(nil)).Elem())
  530. }
  531. return &stringCodec{}, nil
  532. case reflect.Int:
  533. if typeName != "int" {
  534. return encoderOfType(cfg, reflect.TypeOf((*int)(nil)).Elem())
  535. }
  536. return &intCodec{}, nil
  537. case reflect.Int8:
  538. if typeName != "int8" {
  539. return encoderOfType(cfg, reflect.TypeOf((*int8)(nil)).Elem())
  540. }
  541. return &int8Codec{}, nil
  542. case reflect.Int16:
  543. if typeName != "int16" {
  544. return encoderOfType(cfg, reflect.TypeOf((*int16)(nil)).Elem())
  545. }
  546. return &int16Codec{}, nil
  547. case reflect.Int32:
  548. if typeName != "int32" {
  549. return encoderOfType(cfg, reflect.TypeOf((*int32)(nil)).Elem())
  550. }
  551. return &int32Codec{}, nil
  552. case reflect.Int64:
  553. if typeName != "int64" {
  554. return encoderOfType(cfg, reflect.TypeOf((*int64)(nil)).Elem())
  555. }
  556. return &int64Codec{}, nil
  557. case reflect.Uint:
  558. if typeName != "uint" {
  559. return encoderOfType(cfg, reflect.TypeOf((*uint)(nil)).Elem())
  560. }
  561. return &uintCodec{}, nil
  562. case reflect.Uint8:
  563. if typeName != "uint8" {
  564. return encoderOfType(cfg, reflect.TypeOf((*uint8)(nil)).Elem())
  565. }
  566. return &uint8Codec{}, nil
  567. case reflect.Uint16:
  568. if typeName != "uint16" {
  569. return encoderOfType(cfg, reflect.TypeOf((*uint16)(nil)).Elem())
  570. }
  571. return &uint16Codec{}, nil
  572. case reflect.Uint32:
  573. if typeName != "uint32" {
  574. return encoderOfType(cfg, reflect.TypeOf((*uint32)(nil)).Elem())
  575. }
  576. return &uint32Codec{}, nil
  577. case reflect.Uintptr:
  578. if typeName != "uintptr" {
  579. return encoderOfType(cfg, reflect.TypeOf((*uintptr)(nil)).Elem())
  580. }
  581. return &uintptrCodec{}, nil
  582. case reflect.Uint64:
  583. if typeName != "uint64" {
  584. return encoderOfType(cfg, reflect.TypeOf((*uint64)(nil)).Elem())
  585. }
  586. return &uint64Codec{}, nil
  587. case reflect.Float32:
  588. if typeName != "float32" {
  589. return encoderOfType(cfg, reflect.TypeOf((*float32)(nil)).Elem())
  590. }
  591. return &float32Codec{}, nil
  592. case reflect.Float64:
  593. if typeName != "float64" {
  594. return encoderOfType(cfg, reflect.TypeOf((*float64)(nil)).Elem())
  595. }
  596. return &float64Codec{}, nil
  597. case reflect.Bool:
  598. if typeName != "bool" {
  599. return encoderOfType(cfg, reflect.TypeOf((*bool)(nil)).Elem())
  600. }
  601. return &boolCodec{}, nil
  602. case reflect.Interface:
  603. if typ.NumMethod() == 0 {
  604. return &emptyInterfaceCodec{}, nil
  605. }
  606. return &nonEmptyInterfaceCodec{}, nil
  607. case reflect.Struct:
  608. return prefix(fmt.Sprintf("[%s]", typeName)).addToEncoder(encoderOfStruct(cfg, typ))
  609. case reflect.Array:
  610. return prefix("[array]").addToEncoder(encoderOfArray(cfg, typ))
  611. case reflect.Slice:
  612. return prefix("[slice]").addToEncoder(encoderOfSlice(cfg, typ))
  613. case reflect.Map:
  614. return prefix("[map]").addToEncoder(encoderOfMap(cfg, typ))
  615. case reflect.Ptr:
  616. return prefix("[optional]").addToEncoder(encoderOfOptional(cfg, typ))
  617. default:
  618. return nil, fmt.Errorf("unsupported type: %v", typ)
  619. }
  620. }
  621. func decoderOfOptional(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) {
  622. elemType := typ.Elem()
  623. decoder, err := decoderOfType(cfg, elemType)
  624. if err != nil {
  625. return nil, err
  626. }
  627. return &optionalDecoder{elemType, decoder}, nil
  628. }
  629. func encoderOfOptional(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  630. elemType := typ.Elem()
  631. elemEncoder, err := encoderOfType(cfg, elemType)
  632. if err != nil {
  633. return nil, err
  634. }
  635. encoder := &optionalEncoder{elemEncoder}
  636. if elemType.Kind() == reflect.Map {
  637. encoder = &optionalEncoder{encoder}
  638. }
  639. return encoder, nil
  640. }
  641. func decoderOfMap(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) {
  642. decoder, err := decoderOfType(cfg, typ.Elem())
  643. if err != nil {
  644. return nil, err
  645. }
  646. mapInterface := reflect.New(typ).Interface()
  647. return &mapDecoder{typ, typ.Key(), typ.Elem(), decoder, extractInterface(mapInterface)}, nil
  648. }
  649. func extractInterface(val interface{}) emptyInterface {
  650. return *((*emptyInterface)(unsafe.Pointer(&val)))
  651. }
  652. func encoderOfMap(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  653. elemType := typ.Elem()
  654. encoder, err := encoderOfType(cfg, elemType)
  655. if err != nil {
  656. return nil, err
  657. }
  658. mapInterface := reflect.New(typ).Elem().Interface()
  659. if cfg.sortMapKeys {
  660. return &sortKeysMapEncoder{typ, elemType, encoder, *((*emptyInterface)(unsafe.Pointer(&mapInterface)))}, nil
  661. }
  662. return &mapEncoder{typ, elemType, encoder, *((*emptyInterface)(unsafe.Pointer(&mapInterface)))}, nil
  663. }