5
5
"errors"
6
6
"io"
7
7
"reflect"
8
- "sync/atomic"
9
8
"unsafe"
10
9
)
11
10
@@ -23,19 +22,6 @@ type Config struct {
23
22
ObjectFieldMustBeSimpleString bool
24
23
}
25
24
26
- type frozenConfig struct {
27
- configBeforeFrozen Config
28
- sortMapKeys bool
29
- indentionStep int
30
- objectFieldMustBeSimpleString bool
31
- onlyTaggedField bool
32
- decoderCache unsafe.Pointer
33
- encoderCache unsafe.Pointer
34
- extensions []Extension
35
- streamPool chan * Stream
36
- iteratorPool chan * Iterator
37
- }
38
-
39
25
// API the public interface of this package.
40
26
// Primary Marshal and Unmarshal.
41
27
type API interface {
@@ -83,8 +69,7 @@ func (cfg Config) Froze() API {
83
69
streamPool : make (chan * Stream , 16 ),
84
70
iteratorPool : make (chan * Iterator , 16 ),
85
71
}
86
- atomic .StorePointer (& frozenConfig .decoderCache , unsafe .Pointer (& map [string ]ValDecoder {}))
87
- atomic .StorePointer (& frozenConfig .encoderCache , unsafe .Pointer (& map [string ]ValEncoder {}))
72
+ frozenConfig .initCache ()
88
73
if cfg .MarshalFloatWith6Digits {
89
74
frozenConfig .marshalFloatWith6Digits ()
90
75
}
@@ -198,46 +183,6 @@ func (cfg *frozenConfig) escapeHTML() {
198
183
cfg .addEncoderToCache (reflect .TypeOf ((* string )(nil )).Elem (), & htmlEscapedStringEncoder {})
199
184
}
200
185
201
- func (cfg * frozenConfig ) addDecoderToCache (cacheKey reflect.Type , decoder ValDecoder ) {
202
- done := false
203
- for ! done {
204
- ptr := atomic .LoadPointer (& cfg .decoderCache )
205
- cache := * (* map [reflect.Type ]ValDecoder )(ptr )
206
- copied := map [reflect.Type ]ValDecoder {}
207
- for k , v := range cache {
208
- copied [k ] = v
209
- }
210
- copied [cacheKey ] = decoder
211
- done = atomic .CompareAndSwapPointer (& cfg .decoderCache , ptr , unsafe .Pointer (& copied ))
212
- }
213
- }
214
-
215
- func (cfg * frozenConfig ) addEncoderToCache (cacheKey reflect.Type , encoder ValEncoder ) {
216
- done := false
217
- for ! done {
218
- ptr := atomic .LoadPointer (& cfg .encoderCache )
219
- cache := * (* map [reflect.Type ]ValEncoder )(ptr )
220
- copied := map [reflect.Type ]ValEncoder {}
221
- for k , v := range cache {
222
- copied [k ] = v
223
- }
224
- copied [cacheKey ] = encoder
225
- done = atomic .CompareAndSwapPointer (& cfg .encoderCache , ptr , unsafe .Pointer (& copied ))
226
- }
227
- }
228
-
229
- func (cfg * frozenConfig ) getDecoderFromCache (cacheKey reflect.Type ) ValDecoder {
230
- ptr := atomic .LoadPointer (& cfg .decoderCache )
231
- cache := * (* map [reflect.Type ]ValDecoder )(ptr )
232
- return cache [cacheKey ]
233
- }
234
-
235
- func (cfg * frozenConfig ) getEncoderFromCache (cacheKey reflect.Type ) ValEncoder {
236
- ptr := atomic .LoadPointer (& cfg .encoderCache )
237
- cache := * (* map [reflect.Type ]ValEncoder )(ptr )
238
- return cache [cacheKey ]
239
- }
240
-
241
186
func (cfg * frozenConfig ) cleanDecoders () {
242
187
typeDecoders = map [string ]ValDecoder {}
243
188
fieldDecoders = map [string ]ValDecoder {}
0 commit comments