Skip to content

Commit 10a568c

Browse files
committed
fix #293 copy extensions
1 parent ab8a2e0 commit 10a568c

File tree

5 files changed

+50
-25
lines changed

5 files changed

+50
-25
lines changed

adapter.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ func (adapter *Decoder) Buffered() io.Reader {
9898
func (adapter *Decoder) UseNumber() {
9999
cfg := adapter.iter.cfg.configBeforeFrozen
100100
cfg.UseNumber = true
101-
adapter.iter.cfg = cfg.frozeWithCacheReuse()
101+
adapter.iter.cfg = cfg.frozeWithCacheReuse(adapter.iter.cfg.extraExtensions)
102102
}
103103

104104
// DisallowUnknownFields causes the Decoder to return an error when the destination
@@ -107,7 +107,7 @@ func (adapter *Decoder) UseNumber() {
107107
func (adapter *Decoder) DisallowUnknownFields() {
108108
cfg := adapter.iter.cfg.configBeforeFrozen
109109
cfg.DisallowUnknownFields = true
110-
adapter.iter.cfg = cfg.frozeWithCacheReuse()
110+
adapter.iter.cfg = cfg.frozeWithCacheReuse(adapter.iter.cfg.extraExtensions)
111111
}
112112

113113
// NewEncoder same as json.NewEncoder
@@ -132,14 +132,14 @@ func (adapter *Encoder) Encode(val interface{}) error {
132132
func (adapter *Encoder) SetIndent(prefix, indent string) {
133133
config := adapter.stream.cfg.configBeforeFrozen
134134
config.IndentionStep = len(indent)
135-
adapter.stream.cfg = config.frozeWithCacheReuse()
135+
adapter.stream.cfg = config.frozeWithCacheReuse(adapter.stream.cfg.extraExtensions)
136136
}
137137

138138
// SetEscapeHTML escape html by default, set to false to disable
139139
func (adapter *Encoder) SetEscapeHTML(escapeHTML bool) {
140140
config := adapter.stream.cfg.configBeforeFrozen
141141
config.EscapeHTML = escapeHTML
142-
adapter.stream.cfg = config.frozeWithCacheReuse()
142+
adapter.stream.cfg = config.frozeWithCacheReuse(adapter.stream.cfg.extraExtensions)
143143
}
144144

145145
// Valid reports whether data is a valid JSON encoding.

config.go

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,9 @@ type frozenConfig struct {
7474
disallowUnknownFields bool
7575
decoderCache *concurrent.Map
7676
encoderCache *concurrent.Map
77-
extensions []Extension
77+
encoderExtension Extension
78+
decoderExtension Extension
79+
extraExtensions []Extension
7880
streamPool *sync.Pool
7981
iteratorPool *sync.Pool
8082
caseSensitive bool
@@ -158,22 +160,21 @@ func (cfg Config) Froze() API {
158160
if cfg.ValidateJsonRawMessage {
159161
api.validateJsonRawMessage(encoderExtension)
160162
}
161-
if len(encoderExtension) > 0 {
162-
api.extensions = append(api.extensions, encoderExtension)
163-
}
164-
if len(decoderExtension) > 0 {
165-
api.extensions = append(api.extensions, decoderExtension)
166-
}
163+
api.encoderExtension = encoderExtension
164+
api.decoderExtension = decoderExtension
167165
api.configBeforeFrozen = cfg
168166
return api
169167
}
170168

171-
func (cfg Config) frozeWithCacheReuse() *frozenConfig {
169+
func (cfg Config) frozeWithCacheReuse(extraExtensions []Extension) *frozenConfig {
172170
api := getFrozenConfigFromCache(cfg)
173171
if api != nil {
174172
return api
175173
}
176174
api = cfg.Froze().(*frozenConfig)
175+
for _, extension := range extraExtensions {
176+
api.RegisterExtension(extension)
177+
}
177178
addFrozenConfigToCache(cfg, api)
178179
return api
179180
}
@@ -219,7 +220,9 @@ func (cfg *frozenConfig) getTagKey() string {
219220
}
220221

221222
func (cfg *frozenConfig) RegisterExtension(extension Extension) {
222-
cfg.extensions = append(cfg.extensions, extension)
223+
cfg.extraExtensions = append(cfg.extraExtensions, extension)
224+
copied := cfg.configBeforeFrozen
225+
cfg.configBeforeFrozen = copied
223226
}
224227

225228
type lossyFloat32Encoder struct {
@@ -314,7 +317,7 @@ func (cfg *frozenConfig) MarshalIndent(v interface{}, prefix, indent string) ([]
314317
}
315318
newCfg := cfg.configBeforeFrozen
316319
newCfg.IndentionStep = len(indent)
317-
return newCfg.frozeWithCacheReuse().Marshal(v)
320+
return newCfg.frozeWithCacheReuse(cfg.extraExtensions).Marshal(v)
318321
}
319322

320323
func (cfg *frozenConfig) UnmarshalFromString(str string, v interface{}) error {

reflect.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,8 @@ func decoderOfType(ctx *ctx, typ reflect2.Type) ValDecoder {
120120
for _, extension := range extensions {
121121
decoder = extension.DecorateDecoder(typ, decoder)
122122
}
123-
for _, extension := range ctx.extensions {
123+
decoder = ctx.decoderExtension.DecorateDecoder(typ, decoder)
124+
for _, extension := range ctx.extraExtensions {
124125
decoder = extension.DecorateDecoder(typ, decoder)
125126
}
126127
return decoder
@@ -222,7 +223,8 @@ func encoderOfType(ctx *ctx, typ reflect2.Type) ValEncoder {
222223
for _, extension := range extensions {
223224
encoder = extension.DecorateEncoder(typ, encoder)
224225
}
225-
for _, extension := range ctx.extensions {
226+
encoder = ctx.encoderExtension.DecorateEncoder(typ, encoder)
227+
for _, extension := range ctx.extraExtensions {
226228
encoder = extension.DecorateEncoder(typ, encoder)
227229
}
228230
return encoder

reflect_extension.go

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,8 @@ func getTypeDecoderFromExtension(ctx *ctx, typ reflect2.Type) ValDecoder {
246246
for _, extension := range extensions {
247247
decoder = extension.DecorateDecoder(typ, decoder)
248248
}
249-
for _, extension := range ctx.extensions {
249+
decoder = ctx.decoderExtension.DecorateDecoder(typ, decoder)
250+
for _, extension := range ctx.extraExtensions {
250251
decoder = extension.DecorateDecoder(typ, decoder)
251252
}
252253
}
@@ -259,14 +260,18 @@ func _getTypeDecoderFromExtension(ctx *ctx, typ reflect2.Type) ValDecoder {
259260
return decoder
260261
}
261262
}
262-
for _, extension := range ctx.extensions {
263+
decoder := ctx.decoderExtension.CreateDecoder(typ)
264+
if decoder != nil {
265+
return decoder
266+
}
267+
for _, extension := range ctx.extraExtensions {
263268
decoder := extension.CreateDecoder(typ)
264269
if decoder != nil {
265270
return decoder
266271
}
267272
}
268273
typeName := typ.String()
269-
decoder := typeDecoders[typeName]
274+
decoder = typeDecoders[typeName]
270275
if decoder != nil {
271276
return decoder
272277
}
@@ -286,7 +291,8 @@ func getTypeEncoderFromExtension(ctx *ctx, typ reflect2.Type) ValEncoder {
286291
for _, extension := range extensions {
287292
encoder = extension.DecorateEncoder(typ, encoder)
288293
}
289-
for _, extension := range ctx.extensions {
294+
encoder = ctx.encoderExtension.DecorateEncoder(typ, encoder)
295+
for _, extension := range ctx.extraExtensions {
290296
encoder = extension.DecorateEncoder(typ, encoder)
291297
}
292298
}
@@ -300,14 +306,18 @@ func _getTypeEncoderFromExtension(ctx *ctx, typ reflect2.Type) ValEncoder {
300306
return encoder
301307
}
302308
}
303-
for _, extension := range ctx.extensions {
309+
encoder := ctx.encoderExtension.CreateEncoder(typ)
310+
if encoder != nil {
311+
return encoder
312+
}
313+
for _, extension := range ctx.extraExtensions {
304314
encoder := extension.CreateEncoder(typ)
305315
if encoder != nil {
306316
return encoder
307317
}
308318
}
309319
typeName := typ.String()
310-
encoder := typeEncoders[typeName]
320+
encoder = typeEncoders[typeName]
311321
if encoder != nil {
312322
return encoder
313323
}
@@ -393,7 +403,9 @@ func createStructDescriptor(ctx *ctx, typ reflect2.Type, bindings []*Binding, em
393403
for _, extension := range extensions {
394404
extension.UpdateStructDescriptor(structDescriptor)
395405
}
396-
for _, extension := range ctx.extensions {
406+
ctx.encoderExtension.UpdateStructDescriptor(structDescriptor)
407+
ctx.decoderExtension.UpdateStructDescriptor(structDescriptor)
408+
for _, extension := range ctx.extraExtensions {
397409
extension.UpdateStructDescriptor(structDescriptor)
398410
}
399411
processTags(structDescriptor, ctx.frozenConfig)

reflect_map.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,11 @@ func encoderOfMap(ctx *ctx, typ reflect2.Type) ValEncoder {
3939
}
4040

4141
func decoderOfMapKey(ctx *ctx, typ reflect2.Type) ValDecoder {
42-
for _, extension := range ctx.extensions {
42+
decoder := ctx.decoderExtension.CreateMapKeyDecoder(typ)
43+
if decoder != nil {
44+
return decoder
45+
}
46+
for _, extension := range ctx.extraExtensions {
4347
decoder := extension.CreateMapKeyDecoder(typ)
4448
if decoder != nil {
4549
return decoder
@@ -77,7 +81,11 @@ func decoderOfMapKey(ctx *ctx, typ reflect2.Type) ValDecoder {
7781
}
7882

7983
func encoderOfMapKey(ctx *ctx, typ reflect2.Type) ValEncoder {
80-
for _, extension := range ctx.extensions {
84+
encoder := ctx.encoderExtension.CreateMapKeyEncoder(typ)
85+
if encoder != nil {
86+
return encoder
87+
}
88+
for _, extension := range ctx.extraExtensions {
8189
encoder := extension.CreateMapKeyEncoder(typ)
8290
if encoder != nil {
8391
return encoder

0 commit comments

Comments
 (0)