feature_reflect.go 18 KB

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