feature_reflect.go 21 KB

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