feature_reflect.go 20 KB

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