feature_reflect.go 21 KB

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