feature_reflect.go 20 KB

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