feature_reflect.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579
  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. func WriteToStream(val interface{}, stream *Stream, encoder ValEncoder) {
  32. e := (*emptyInterface)(unsafe.Pointer(&val))
  33. if e.word == nil {
  34. stream.WriteNil()
  35. return
  36. }
  37. if reflect.TypeOf(val).Kind() == reflect.Ptr {
  38. encoder.Encode(unsafe.Pointer(&e.word), stream)
  39. } else {
  40. encoder.Encode(e.word, stream)
  41. }
  42. }
  43. type DecoderFunc func(ptr unsafe.Pointer, iter *Iterator)
  44. type EncoderFunc func(ptr unsafe.Pointer, stream *Stream)
  45. var jsonNumberType reflect.Type
  46. var jsonRawMessageType reflect.Type
  47. var jsoniterRawMessageType reflect.Type
  48. var anyType reflect.Type
  49. var marshalerType reflect.Type
  50. var unmarshalerType reflect.Type
  51. var textMarshalerType reflect.Type
  52. var textUnmarshalerType reflect.Type
  53. func init() {
  54. jsonNumberType = reflect.TypeOf((*json.Number)(nil)).Elem()
  55. jsonRawMessageType = reflect.TypeOf((*json.RawMessage)(nil)).Elem()
  56. jsoniterRawMessageType = reflect.TypeOf((*RawMessage)(nil)).Elem()
  57. anyType = reflect.TypeOf((*Any)(nil)).Elem()
  58. marshalerType = reflect.TypeOf((*json.Marshaler)(nil)).Elem()
  59. unmarshalerType = reflect.TypeOf((*json.Unmarshaler)(nil)).Elem()
  60. textMarshalerType = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem()
  61. textUnmarshalerType = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem()
  62. }
  63. type optionalDecoder struct {
  64. valueType reflect.Type
  65. valueDecoder ValDecoder
  66. }
  67. func (decoder *optionalDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  68. if iter.ReadNil() {
  69. *((*unsafe.Pointer)(ptr)) = nil
  70. } else {
  71. if *((*unsafe.Pointer)(ptr)) == nil {
  72. // pointer to null, we have to allocate memory to hold the value
  73. value := reflect.New(decoder.valueType)
  74. decoder.valueDecoder.Decode(unsafe.Pointer(value.Pointer()), iter)
  75. *((*uintptr)(ptr)) = value.Pointer()
  76. } else {
  77. // reuse existing instance
  78. decoder.valueDecoder.Decode(*((*unsafe.Pointer)(ptr)), iter)
  79. }
  80. }
  81. }
  82. type optionalEncoder struct {
  83. valueEncoder ValEncoder
  84. }
  85. func (encoder *optionalEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
  86. if *((*unsafe.Pointer)(ptr)) == nil {
  87. stream.WriteNil()
  88. } else {
  89. encoder.valueEncoder.Encode(*((*unsafe.Pointer)(ptr)), stream)
  90. }
  91. }
  92. func (encoder *optionalEncoder) EncodeInterface(val interface{}, stream *Stream) {
  93. WriteToStream(val, stream, encoder)
  94. }
  95. func (encoder *optionalEncoder) IsEmpty(ptr unsafe.Pointer) bool {
  96. if *((*unsafe.Pointer)(ptr)) == nil {
  97. return true
  98. } else {
  99. return false
  100. }
  101. }
  102. type placeholderEncoder struct {
  103. cfg *frozenConfig
  104. cacheKey reflect.Type
  105. }
  106. func (encoder *placeholderEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
  107. encoder.getRealEncoder().Encode(ptr, stream)
  108. }
  109. func (encoder *placeholderEncoder) EncodeInterface(val interface{}, stream *Stream) {
  110. WriteToStream(val, stream, encoder)
  111. }
  112. func (encoder *placeholderEncoder) IsEmpty(ptr unsafe.Pointer) bool {
  113. return encoder.getRealEncoder().IsEmpty(ptr)
  114. }
  115. func (encoder *placeholderEncoder) getRealEncoder() ValEncoder {
  116. for i := 0; i < 30; i++ {
  117. realDecoder := encoder.cfg.getEncoderFromCache(encoder.cacheKey)
  118. _, isPlaceholder := realDecoder.(*placeholderEncoder)
  119. if isPlaceholder {
  120. time.Sleep(time.Second)
  121. } else {
  122. return realDecoder
  123. }
  124. }
  125. panic(fmt.Sprintf("real encoder not found for cache key: %v", encoder.cacheKey))
  126. }
  127. type placeholderDecoder struct {
  128. cfg *frozenConfig
  129. cacheKey reflect.Type
  130. }
  131. func (decoder *placeholderDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  132. for i := 0; i < 30; i++ {
  133. realDecoder := decoder.cfg.getDecoderFromCache(decoder.cacheKey)
  134. _, isPlaceholder := realDecoder.(*placeholderDecoder)
  135. if isPlaceholder {
  136. time.Sleep(time.Second)
  137. } else {
  138. realDecoder.Decode(ptr, iter)
  139. return
  140. }
  141. }
  142. panic(fmt.Sprintf("real decoder not found for cache key: %v", decoder.cacheKey))
  143. }
  144. // emptyInterface is the header for an interface{} value.
  145. type emptyInterface struct {
  146. typ unsafe.Pointer
  147. word unsafe.Pointer
  148. }
  149. // emptyInterface is the header for an interface with method (not interface{})
  150. type nonEmptyInterface struct {
  151. // see ../runtime/iface.go:/Itab
  152. itab *struct {
  153. ityp unsafe.Pointer // static interface type
  154. typ unsafe.Pointer // dynamic concrete type
  155. link unsafe.Pointer
  156. bad int32
  157. unused int32
  158. fun [100000]unsafe.Pointer // method table
  159. }
  160. word unsafe.Pointer
  161. }
  162. // Read converts an Iterator instance into go interface, same as json.Unmarshal
  163. func (iter *Iterator) ReadVal(obj interface{}) {
  164. typ := reflect.TypeOf(obj)
  165. cacheKey := typ.Elem()
  166. decoder, err := decoderOfType(iter.cfg, cacheKey)
  167. if err != nil {
  168. iter.Error = err
  169. return
  170. }
  171. e := (*emptyInterface)(unsafe.Pointer(&obj))
  172. decoder.Decode(e.word, iter)
  173. }
  174. func (stream *Stream) WriteVal(val interface{}) {
  175. if nil == val {
  176. stream.WriteNil()
  177. return
  178. }
  179. typ := reflect.TypeOf(val)
  180. cacheKey := typ
  181. encoder, err := encoderOfType(stream.cfg, cacheKey)
  182. if err != nil {
  183. stream.Error = err
  184. return
  185. }
  186. encoder.EncodeInterface(val, stream)
  187. }
  188. type prefix string
  189. func (p prefix) addToDecoder(decoder ValDecoder, err error) (ValDecoder, error) {
  190. if err != nil {
  191. return nil, fmt.Errorf("%s: %s", p, err.Error())
  192. }
  193. return decoder, err
  194. }
  195. func (p prefix) addToEncoder(encoder ValEncoder, err error) (ValEncoder, error) {
  196. if err != nil {
  197. return nil, fmt.Errorf("%s: %s", p, err.Error())
  198. }
  199. return encoder, err
  200. }
  201. func decoderOfType(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) {
  202. cacheKey := typ
  203. decoder := cfg.getDecoderFromCache(cacheKey)
  204. if decoder != nil {
  205. return decoder, nil
  206. }
  207. decoder = getTypeDecoderFromExtension(typ)
  208. if decoder != nil {
  209. cfg.addDecoderToCache(cacheKey, decoder)
  210. return decoder, nil
  211. }
  212. decoder = &placeholderDecoder{cfg: cfg, cacheKey: cacheKey}
  213. cfg.addDecoderToCache(cacheKey, decoder)
  214. decoder, err := createDecoderOfType(cfg, typ)
  215. for _, extension := range extensions {
  216. decoder = extension.DecorateDecoder(typ, decoder)
  217. }
  218. cfg.addDecoderToCache(cacheKey, decoder)
  219. return decoder, err
  220. }
  221. func createDecoderOfType(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) {
  222. typeName := typ.String()
  223. if typ == jsonRawMessageType {
  224. return &jsonRawMessageCodec{}, nil
  225. }
  226. if typ == jsoniterRawMessageType {
  227. return &jsoniterRawMessageCodec{}, nil
  228. }
  229. if typ.AssignableTo(jsonNumberType) {
  230. return &jsonNumberCodec{}, nil
  231. }
  232. if typ.Kind() == reflect.Slice && typ.Elem().Kind() == reflect.Uint8 {
  233. return &base64Codec{}, nil
  234. }
  235. if typ.Implements(unmarshalerType) {
  236. templateInterface := reflect.New(typ).Elem().Interface()
  237. var decoder ValDecoder = &unmarshalerDecoder{extractInterface(templateInterface)}
  238. if typ.Kind() != reflect.Struct {
  239. decoder = &optionalDecoder{typ, decoder}
  240. }
  241. return decoder, nil
  242. }
  243. if reflect.PtrTo(typ).Implements(unmarshalerType) {
  244. templateInterface := reflect.New(typ).Interface()
  245. var decoder ValDecoder = &unmarshalerDecoder{extractInterface(templateInterface)}
  246. return decoder, nil
  247. }
  248. if typ.Implements(textUnmarshalerType) {
  249. templateInterface := reflect.New(typ).Elem().Interface()
  250. var decoder ValDecoder = &textUnmarshalerDecoder{extractInterface(templateInterface)}
  251. if typ.Kind() != reflect.Struct {
  252. decoder = &optionalDecoder{typ, decoder}
  253. }
  254. return decoder, nil
  255. }
  256. if reflect.PtrTo(typ).Implements(textUnmarshalerType) {
  257. templateInterface := reflect.New(typ).Interface()
  258. var decoder ValDecoder = &textUnmarshalerDecoder{extractInterface(templateInterface)}
  259. return decoder, nil
  260. }
  261. if typ.Implements(anyType) {
  262. return &anyCodec{}, nil
  263. }
  264. switch typ.Kind() {
  265. case reflect.String:
  266. if typeName != "string" {
  267. return decoderOfType(cfg, reflect.TypeOf((*string)(nil)).Elem())
  268. }
  269. return &stringCodec{}, nil
  270. case reflect.Int:
  271. if typeName != "int" {
  272. return decoderOfType(cfg, reflect.TypeOf((*int)(nil)).Elem())
  273. }
  274. return &intCodec{}, nil
  275. case reflect.Int8:
  276. if typeName != "int8" {
  277. return decoderOfType(cfg, reflect.TypeOf((*int8)(nil)).Elem())
  278. }
  279. return &int8Codec{}, nil
  280. case reflect.Int16:
  281. if typeName != "int16" {
  282. return decoderOfType(cfg, reflect.TypeOf((*int16)(nil)).Elem())
  283. }
  284. return &int16Codec{}, nil
  285. case reflect.Int32:
  286. if typeName != "int32" {
  287. return decoderOfType(cfg, reflect.TypeOf((*int32)(nil)).Elem())
  288. }
  289. return &int32Codec{}, nil
  290. case reflect.Int64:
  291. if typeName != "int64" {
  292. return decoderOfType(cfg, reflect.TypeOf((*int64)(nil)).Elem())
  293. }
  294. return &int64Codec{}, nil
  295. case reflect.Uint:
  296. if typeName != "uint" {
  297. return decoderOfType(cfg, reflect.TypeOf((*uint)(nil)).Elem())
  298. }
  299. return &uintCodec{}, nil
  300. case reflect.Uint8:
  301. if typeName != "uint8" {
  302. return decoderOfType(cfg, reflect.TypeOf((*uint8)(nil)).Elem())
  303. }
  304. return &uint8Codec{}, nil
  305. case reflect.Uint16:
  306. if typeName != "uint16" {
  307. return decoderOfType(cfg, reflect.TypeOf((*uint16)(nil)).Elem())
  308. }
  309. return &uint16Codec{}, nil
  310. case reflect.Uint32:
  311. if typeName != "uint32" {
  312. return decoderOfType(cfg, reflect.TypeOf((*uint32)(nil)).Elem())
  313. }
  314. return &uint32Codec{}, nil
  315. case reflect.Uint64:
  316. if typeName != "uint64" {
  317. return decoderOfType(cfg, reflect.TypeOf((*uint64)(nil)).Elem())
  318. }
  319. return &uint64Codec{}, nil
  320. case reflect.Float32:
  321. if typeName != "float32" {
  322. return decoderOfType(cfg, reflect.TypeOf((*float32)(nil)).Elem())
  323. }
  324. return &float32Codec{}, nil
  325. case reflect.Float64:
  326. if typeName != "float64" {
  327. return decoderOfType(cfg, reflect.TypeOf((*float64)(nil)).Elem())
  328. }
  329. return &float64Codec{}, nil
  330. case reflect.Bool:
  331. if typeName != "bool" {
  332. return decoderOfType(cfg, reflect.TypeOf((*bool)(nil)).Elem())
  333. }
  334. return &boolCodec{}, nil
  335. case reflect.Interface:
  336. if typ.NumMethod() == 0 {
  337. return &emptyInterfaceCodec{}, nil
  338. } else {
  339. return &nonEmptyInterfaceCodec{}, nil
  340. }
  341. case reflect.Struct:
  342. return prefix(fmt.Sprintf("[%s]", typeName)).addToDecoder(decoderOfStruct(cfg, typ))
  343. case reflect.Array:
  344. return prefix("[array]").addToDecoder(decoderOfArray(cfg, typ))
  345. case reflect.Slice:
  346. return prefix("[slice]").addToDecoder(decoderOfSlice(cfg, typ))
  347. case reflect.Map:
  348. return prefix("[map]").addToDecoder(decoderOfMap(cfg, typ))
  349. case reflect.Ptr:
  350. return prefix("[optional]").addToDecoder(decoderOfOptional(cfg, typ))
  351. default:
  352. return nil, fmt.Errorf("unsupported type: %v", typ)
  353. }
  354. }
  355. func encoderOfType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  356. cacheKey := typ
  357. encoder := cfg.getEncoderFromCache(cacheKey)
  358. if encoder != nil {
  359. return encoder, nil
  360. }
  361. encoder = getTypeEncoderFromExtension(typ)
  362. if encoder != nil {
  363. cfg.addEncoderToCache(cacheKey, encoder)
  364. return encoder, nil
  365. }
  366. encoder = &placeholderEncoder{cfg: cfg, cacheKey: cacheKey}
  367. cfg.addEncoderToCache(cacheKey, encoder)
  368. encoder, err := createEncoderOfType(cfg, typ)
  369. for _, extension := range extensions {
  370. encoder = extension.DecorateEncoder(typ, encoder)
  371. }
  372. cfg.addEncoderToCache(cacheKey, encoder)
  373. return encoder, err
  374. }
  375. func createEncoderOfType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  376. typeName := typ.String()
  377. if typ == jsonRawMessageType {
  378. return &jsonRawMessageCodec{}, nil
  379. }
  380. if typ == jsoniterRawMessageType {
  381. return &jsoniterRawMessageCodec{}, nil
  382. }
  383. if typ.AssignableTo(jsonNumberType) {
  384. return &jsonNumberCodec{}, nil
  385. }
  386. if typ.Kind() == reflect.Slice && typ.Elem().Kind() == reflect.Uint8 {
  387. return &base64Codec{typ}, nil
  388. }
  389. if typ.Implements(marshalerType) {
  390. templateInterface := reflect.New(typ).Elem().Interface()
  391. var encoder ValEncoder = &marshalerEncoder{extractInterface(templateInterface)}
  392. if typ.Kind() != reflect.Struct {
  393. encoder = &optionalEncoder{encoder}
  394. }
  395. return encoder, nil
  396. }
  397. if typ.Implements(textMarshalerType) {
  398. templateInterface := reflect.New(typ).Elem().Interface()
  399. var encoder ValEncoder = &textMarshalerEncoder{extractInterface(templateInterface)}
  400. if typ.Kind() != reflect.Struct {
  401. encoder = &optionalEncoder{encoder}
  402. }
  403. return encoder, nil
  404. }
  405. if typ.Implements(anyType) {
  406. return &anyCodec{}, nil
  407. }
  408. kind := typ.Kind()
  409. switch kind {
  410. case reflect.String:
  411. if typeName != "string" {
  412. return encoderOfType(cfg, reflect.TypeOf((*string)(nil)).Elem())
  413. }
  414. return &stringCodec{}, nil
  415. case reflect.Int:
  416. if typeName != "int" {
  417. return encoderOfType(cfg, reflect.TypeOf((*int)(nil)).Elem())
  418. }
  419. return &intCodec{}, nil
  420. case reflect.Int8:
  421. if typeName != "int8" {
  422. return encoderOfType(cfg, reflect.TypeOf((*int8)(nil)).Elem())
  423. }
  424. return &int8Codec{}, nil
  425. case reflect.Int16:
  426. if typeName != "int16" {
  427. return encoderOfType(cfg, reflect.TypeOf((*int16)(nil)).Elem())
  428. }
  429. return &int16Codec{}, nil
  430. case reflect.Int32:
  431. if typeName != "int32" {
  432. return encoderOfType(cfg, reflect.TypeOf((*int32)(nil)).Elem())
  433. }
  434. return &int32Codec{}, nil
  435. case reflect.Int64:
  436. if typeName != "int64" {
  437. return encoderOfType(cfg, reflect.TypeOf((*int64)(nil)).Elem())
  438. }
  439. return &int64Codec{}, nil
  440. case reflect.Uint:
  441. if typeName != "uint" {
  442. return encoderOfType(cfg, reflect.TypeOf((*uint)(nil)).Elem())
  443. }
  444. return &uintCodec{}, nil
  445. case reflect.Uint8:
  446. if typeName != "uint8" {
  447. return encoderOfType(cfg, reflect.TypeOf((*uint8)(nil)).Elem())
  448. }
  449. return &uint8Codec{}, nil
  450. case reflect.Uint16:
  451. if typeName != "uint16" {
  452. return encoderOfType(cfg, reflect.TypeOf((*uint16)(nil)).Elem())
  453. }
  454. return &uint16Codec{}, nil
  455. case reflect.Uint32:
  456. if typeName != "uint32" {
  457. return encoderOfType(cfg, reflect.TypeOf((*uint32)(nil)).Elem())
  458. }
  459. return &uint32Codec{}, nil
  460. case reflect.Uint64:
  461. if typeName != "uint64" {
  462. return encoderOfType(cfg, reflect.TypeOf((*uint64)(nil)).Elem())
  463. }
  464. return &uint64Codec{}, nil
  465. case reflect.Float32:
  466. if typeName != "float32" {
  467. return encoderOfType(cfg, reflect.TypeOf((*float32)(nil)).Elem())
  468. }
  469. return &float32Codec{}, nil
  470. case reflect.Float64:
  471. if typeName != "float64" {
  472. return encoderOfType(cfg, reflect.TypeOf((*float64)(nil)).Elem())
  473. }
  474. return &float64Codec{}, nil
  475. case reflect.Bool:
  476. if typeName != "bool" {
  477. return encoderOfType(cfg, reflect.TypeOf((*bool)(nil)).Elem())
  478. }
  479. return &boolCodec{}, nil
  480. case reflect.Interface:
  481. if typ.NumMethod() == 0 {
  482. return &emptyInterfaceCodec{}, nil
  483. } else {
  484. return &nonEmptyInterfaceCodec{}, nil
  485. }
  486. case reflect.Struct:
  487. return prefix(fmt.Sprintf("[%s]", typeName)).addToEncoder(encoderOfStruct(cfg, typ))
  488. case reflect.Array:
  489. return prefix("[array]").addToEncoder(encoderOfArray(cfg, typ))
  490. case reflect.Slice:
  491. return prefix("[slice]").addToEncoder(encoderOfSlice(cfg, typ))
  492. case reflect.Map:
  493. return prefix("[map]").addToEncoder(encoderOfMap(cfg, typ))
  494. case reflect.Ptr:
  495. return prefix("[optional]").addToEncoder(encoderOfOptional(cfg, typ))
  496. default:
  497. return nil, fmt.Errorf("unsupported type: %v", typ)
  498. }
  499. }
  500. func decoderOfOptional(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) {
  501. elemType := typ.Elem()
  502. decoder, err := decoderOfType(cfg, elemType)
  503. if err != nil {
  504. return nil, err
  505. }
  506. return &optionalDecoder{elemType, decoder}, nil
  507. }
  508. func encoderOfOptional(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  509. elemType := typ.Elem()
  510. elemEncoder, err := encoderOfType(cfg, elemType)
  511. if err != nil {
  512. return nil, err
  513. }
  514. encoder := &optionalEncoder{elemEncoder}
  515. if elemType.Kind() == reflect.Map {
  516. encoder = &optionalEncoder{encoder}
  517. }
  518. return encoder, nil
  519. }
  520. func decoderOfMap(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) {
  521. decoder, err := decoderOfType(cfg, typ.Elem())
  522. if err != nil {
  523. return nil, err
  524. }
  525. mapInterface := reflect.New(typ).Interface()
  526. return &mapDecoder{typ, typ.Key(), typ.Elem(), decoder, extractInterface(mapInterface)}, nil
  527. }
  528. func extractInterface(val interface{}) emptyInterface {
  529. return *((*emptyInterface)(unsafe.Pointer(&val)))
  530. }
  531. func encoderOfMap(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  532. elemType := typ.Elem()
  533. encoder, err := encoderOfType(cfg, elemType)
  534. if err != nil {
  535. return nil, err
  536. }
  537. mapInterface := reflect.New(typ).Elem().Interface()
  538. if cfg.sortMapKeys {
  539. return &sortKeysMapEncoder{typ, elemType, encoder, *((*emptyInterface)(unsafe.Pointer(&mapInterface)))}, nil
  540. } else {
  541. return &mapEncoder{typ, elemType, encoder, *((*emptyInterface)(unsafe.Pointer(&mapInterface)))}, nil
  542. }
  543. }