feature_reflect.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631
  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.Struct {
  260. decoder = &optionalDecoder{typ, 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.Struct {
  273. decoder = &optionalDecoder{typ, 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 := createEncoderOfSimpleType(cfg, 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 := createEncoderOfSimpleType(cfg, 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 createEncoderOfSimpleType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  450. typeName := typ.String()
  451. kind := typ.Kind()
  452. switch kind {
  453. case reflect.String:
  454. if typeName != "string" {
  455. return encoderOfType(cfg, reflect.TypeOf((*string)(nil)).Elem())
  456. }
  457. return &stringCodec{}, nil
  458. case reflect.Int:
  459. if typeName != "int" {
  460. return encoderOfType(cfg, reflect.TypeOf((*int)(nil)).Elem())
  461. }
  462. return &intCodec{}, nil
  463. case reflect.Int8:
  464. if typeName != "int8" {
  465. return encoderOfType(cfg, reflect.TypeOf((*int8)(nil)).Elem())
  466. }
  467. return &int8Codec{}, nil
  468. case reflect.Int16:
  469. if typeName != "int16" {
  470. return encoderOfType(cfg, reflect.TypeOf((*int16)(nil)).Elem())
  471. }
  472. return &int16Codec{}, nil
  473. case reflect.Int32:
  474. if typeName != "int32" {
  475. return encoderOfType(cfg, reflect.TypeOf((*int32)(nil)).Elem())
  476. }
  477. return &int32Codec{}, nil
  478. case reflect.Int64:
  479. if typeName != "int64" {
  480. return encoderOfType(cfg, reflect.TypeOf((*int64)(nil)).Elem())
  481. }
  482. return &int64Codec{}, nil
  483. case reflect.Uint:
  484. if typeName != "uint" {
  485. return encoderOfType(cfg, reflect.TypeOf((*uint)(nil)).Elem())
  486. }
  487. return &uintCodec{}, nil
  488. case reflect.Uint8:
  489. if typeName != "uint8" {
  490. return encoderOfType(cfg, reflect.TypeOf((*uint8)(nil)).Elem())
  491. }
  492. return &uint8Codec{}, nil
  493. case reflect.Uint16:
  494. if typeName != "uint16" {
  495. return encoderOfType(cfg, reflect.TypeOf((*uint16)(nil)).Elem())
  496. }
  497. return &uint16Codec{}, nil
  498. case reflect.Uint32:
  499. if typeName != "uint32" {
  500. return encoderOfType(cfg, reflect.TypeOf((*uint32)(nil)).Elem())
  501. }
  502. return &uint32Codec{}, nil
  503. case reflect.Uintptr:
  504. if typeName != "uintptr" {
  505. return encoderOfType(cfg, reflect.TypeOf((*uintptr)(nil)).Elem())
  506. }
  507. return &uintptrCodec{}, nil
  508. case reflect.Uint64:
  509. if typeName != "uint64" {
  510. return encoderOfType(cfg, reflect.TypeOf((*uint64)(nil)).Elem())
  511. }
  512. return &uint64Codec{}, nil
  513. case reflect.Float32:
  514. if typeName != "float32" {
  515. return encoderOfType(cfg, reflect.TypeOf((*float32)(nil)).Elem())
  516. }
  517. return &float32Codec{}, nil
  518. case reflect.Float64:
  519. if typeName != "float64" {
  520. return encoderOfType(cfg, reflect.TypeOf((*float64)(nil)).Elem())
  521. }
  522. return &float64Codec{}, nil
  523. case reflect.Bool:
  524. if typeName != "bool" {
  525. return encoderOfType(cfg, reflect.TypeOf((*bool)(nil)).Elem())
  526. }
  527. return &boolCodec{}, nil
  528. case reflect.Interface:
  529. if typ.NumMethod() == 0 {
  530. return &emptyInterfaceCodec{}, nil
  531. } else {
  532. return &nonEmptyInterfaceCodec{}, nil
  533. }
  534. case reflect.Struct:
  535. return prefix(fmt.Sprintf("[%s]", typeName)).addToEncoder(encoderOfStruct(cfg, typ))
  536. case reflect.Array:
  537. return prefix("[array]").addToEncoder(encoderOfArray(cfg, typ))
  538. case reflect.Slice:
  539. return prefix("[slice]").addToEncoder(encoderOfSlice(cfg, typ))
  540. case reflect.Map:
  541. return prefix("[map]").addToEncoder(encoderOfMap(cfg, typ))
  542. case reflect.Ptr:
  543. return prefix("[optional]").addToEncoder(encoderOfOptional(cfg, typ))
  544. default:
  545. return nil, fmt.Errorf("unsupported type: %v", typ)
  546. }
  547. }
  548. func decoderOfOptional(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) {
  549. elemType := typ.Elem()
  550. decoder, err := decoderOfType(cfg, elemType)
  551. if err != nil {
  552. return nil, err
  553. }
  554. return &optionalDecoder{elemType, decoder}, nil
  555. }
  556. func encoderOfOptional(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  557. elemType := typ.Elem()
  558. elemEncoder, err := encoderOfType(cfg, elemType)
  559. if err != nil {
  560. return nil, err
  561. }
  562. encoder := &optionalEncoder{elemEncoder}
  563. if elemType.Kind() == reflect.Map {
  564. encoder = &optionalEncoder{encoder}
  565. }
  566. return encoder, nil
  567. }
  568. func decoderOfMap(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) {
  569. decoder, err := decoderOfType(cfg, typ.Elem())
  570. if err != nil {
  571. return nil, err
  572. }
  573. mapInterface := reflect.New(typ).Interface()
  574. return &mapDecoder{typ, typ.Key(), typ.Elem(), decoder, extractInterface(mapInterface)}, nil
  575. }
  576. func extractInterface(val interface{}) emptyInterface {
  577. return *((*emptyInterface)(unsafe.Pointer(&val)))
  578. }
  579. func encoderOfMap(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  580. elemType := typ.Elem()
  581. encoder, err := encoderOfType(cfg, elemType)
  582. if err != nil {
  583. return nil, err
  584. }
  585. mapInterface := reflect.New(typ).Elem().Interface()
  586. if cfg.sortMapKeys {
  587. return &sortKeysMapEncoder{typ, elemType, encoder, *((*emptyInterface)(unsafe.Pointer(&mapInterface)))}, nil
  588. } else {
  589. return &mapEncoder{typ, elemType, encoder, *((*emptyInterface)(unsafe.Pointer(&mapInterface)))}, nil
  590. }
  591. }