feature_reflect.go 21 KB

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