| //+build !go1.9 |
| |
| package jsoniter |
| |
| import ( |
| "reflect" |
| "sync" |
| ) |
| |
| type frozenConfig struct { |
| configBeforeFrozen Config |
| sortMapKeys bool |
| indentionStep int |
| objectFieldMustBeSimpleString bool |
| onlyTaggedField bool |
| cacheLock *sync.RWMutex |
| decoderCache map[reflect.Type]ValDecoder |
| encoderCache map[reflect.Type]ValEncoder |
| extensions []Extension |
| streamPool chan *Stream |
| iteratorPool chan *Iterator |
| } |
| |
| func (cfg *frozenConfig) initCache() { |
| cfg.cacheLock = &sync.RWMutex{} |
| cfg.decoderCache = map[reflect.Type]ValDecoder{} |
| cfg.encoderCache = map[reflect.Type]ValEncoder{} |
| } |
| |
| func (cfg *frozenConfig) addDecoderToCache(cacheKey reflect.Type, decoder ValDecoder) { |
| cfg.cacheLock.Lock() |
| cfg.decoderCache[cacheKey] = decoder |
| cfg.cacheLock.Unlock() |
| } |
| |
| func (cfg *frozenConfig) addEncoderToCache(cacheKey reflect.Type, encoder ValEncoder) { |
| cfg.cacheLock.Lock() |
| cfg.encoderCache[cacheKey] = encoder |
| cfg.cacheLock.Unlock() |
| } |
| |
| func (cfg *frozenConfig) getDecoderFromCache(cacheKey reflect.Type) ValDecoder { |
| cfg.cacheLock.RLock() |
| decoder, _ := cfg.decoderCache[cacheKey].(ValDecoder) |
| cfg.cacheLock.RUnlock() |
| return decoder |
| } |
| |
| func (cfg *frozenConfig) getEncoderFromCache(cacheKey reflect.Type) ValEncoder { |
| cfg.cacheLock.RLock() |
| encoder, _ := cfg.encoderCache[cacheKey].(ValEncoder) |
| cfg.cacheLock.RUnlock() |
| return encoder |
| } |