2018-01-28 11:00:11 +02:00
|
|
|
//+build go1.9
|
|
|
|
|
|
|
|
package jsoniter
|
|
|
|
|
|
|
|
import (
|
|
|
|
"reflect"
|
|
|
|
"sync"
|
|
|
|
)
|
|
|
|
|
|
|
|
type frozenConfig struct {
|
|
|
|
configBeforeFrozen Config
|
|
|
|
sortMapKeys bool
|
|
|
|
indentionStep int
|
|
|
|
objectFieldMustBeSimpleString bool
|
|
|
|
onlyTaggedField bool
|
|
|
|
decoderCache sync.Map
|
|
|
|
encoderCache sync.Map
|
|
|
|
extensions []Extension
|
|
|
|
streamPool chan *Stream
|
|
|
|
iteratorPool chan *Iterator
|
|
|
|
}
|
|
|
|
|
|
|
|
func (cfg *frozenConfig) initCache() {
|
|
|
|
cfg.decoderCache = sync.Map{}
|
|
|
|
cfg.encoderCache = sync.Map{}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (cfg *frozenConfig) addDecoderToCache(cacheKey reflect.Type, decoder ValDecoder) {
|
|
|
|
cfg.decoderCache.Store(cacheKey, decoder)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (cfg *frozenConfig) addEncoderToCache(cacheKey reflect.Type, encoder ValEncoder) {
|
|
|
|
cfg.encoderCache.Store(cacheKey, encoder)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (cfg *frozenConfig) getDecoderFromCache(cacheKey reflect.Type) ValDecoder {
|
|
|
|
decoder, found := cfg.decoderCache.Load(cacheKey)
|
|
|
|
if found {
|
|
|
|
return decoder.(ValDecoder)
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (cfg *frozenConfig) getEncoderFromCache(cacheKey reflect.Type) ValEncoder {
|
|
|
|
encoder, found := cfg.encoderCache.Load(cacheKey)
|
|
|
|
if found {
|
|
|
|
return encoder.(ValEncoder)
|
|
|
|
}
|
|
|
|
return nil
|
2018-02-05 15:43:37 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
var cfgCache = &sync.Map{}
|
|
|
|
|
|
|
|
func getFrozenConfigFromCache(cfg Config) *frozenConfig {
|
|
|
|
obj, found := cfgCache.Load(cfg)
|
|
|
|
if found {
|
|
|
|
return obj.(*frozenConfig)
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func addFrozenConfigToCache(cfg Config, frozenConfig *frozenConfig) {
|
|
|
|
cfgCache.Store(cfg, frozenConfig)
|
2018-01-28 11:00:11 +02:00
|
|
|
}
|