Skip to content

Commit 99fc16a

Browse files
committed
use reflect2 to replace reflect
1 parent a386638 commit 99fc16a

22 files changed

+307
-286
lines changed

any.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ func Wrap(val interface{}) Any {
9090
if isAny {
9191
return asAny
9292
}
93-
typ := reflect.TypeOf(val)
93+
typ := reflect2.TypeOf(val)
9494
switch typ.Kind() {
9595
case reflect.Slice:
9696
return wrapArray(val)
@@ -245,27 +245,27 @@ func locatePath(iter *Iterator, path []interface{}) Any {
245245
return iter.readAny()
246246
}
247247

248-
var anyType = reflect.TypeOf((*Any)(nil)).Elem()
248+
var anyType = reflect2.TypeOfPtr((*Any)(nil)).Elem()
249249

250-
func createDecoderOfAny(ctx *ctx, typ reflect.Type) ValDecoder {
250+
func createDecoderOfAny(ctx *ctx, typ reflect2.Type) ValDecoder {
251251
if typ == anyType {
252252
return &directAnyCodec{}
253253
}
254254
if typ.Implements(anyType) {
255255
return &anyCodec{
256-
valType: reflect2.Type2(typ),
256+
valType: typ,
257257
}
258258
}
259259
return nil
260260
}
261261

262-
func createEncoderOfAny(ctx *ctx, typ reflect.Type) ValEncoder {
262+
func createEncoderOfAny(ctx *ctx, typ reflect2.Type) ValEncoder {
263263
if typ == anyType {
264264
return &directAnyCodec{}
265265
}
266266
if typ.Implements(anyType) {
267267
return &anyCodec{
268-
valType: reflect2.Type2(typ),
268+
valType: typ,
269269
}
270270
}
271271
return nil

config.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ package jsoniter
33
import (
44
"encoding/json"
55
"io"
6-
"reflect"
76
"unsafe"
7+
"github.com/v2pro/plz/reflect2"
88
)
99

1010
// Config customize how the API should behave.
@@ -118,12 +118,12 @@ func (cfg *frozenConfig) validateJsonRawMessage(extension EncoderExtension) {
118118
}, func(ptr unsafe.Pointer) bool {
119119
return false
120120
}}
121-
extension[reflect.TypeOf((*json.RawMessage)(nil)).Elem()] = encoder
122-
extension[reflect.TypeOf((*RawMessage)(nil)).Elem()] = encoder
121+
extension[reflect2.TypeOfPtr((*json.RawMessage)(nil)).Elem()] = encoder
122+
extension[reflect2.TypeOfPtr((*RawMessage)(nil)).Elem()] = encoder
123123
}
124124

125125
func (cfg *frozenConfig) useNumber(extension DecoderExtension) {
126-
extension[reflect.TypeOf((*interface{})(nil)).Elem()] = &funcDecoder{func(ptr unsafe.Pointer, iter *Iterator) {
126+
extension[reflect2.TypeOfPtr((*interface{})(nil)).Elem()] = &funcDecoder{func(ptr unsafe.Pointer, iter *Iterator) {
127127
if iter.WhatIsNext() == NumberValue {
128128
*((*interface{})(ptr)) = json.Number(iter.readNumberAsString())
129129
} else {
@@ -169,8 +169,8 @@ func (encoder *lossyFloat64Encoder) IsEmpty(ptr unsafe.Pointer) bool {
169169
// for float variables for better performance.
170170
func (cfg *frozenConfig) marshalFloatWith6Digits(extension EncoderExtension) {
171171
// for better performance
172-
extension[reflect.TypeOf((*float32)(nil)).Elem()] = &lossyFloat32Encoder{}
173-
extension[reflect.TypeOf((*float64)(nil)).Elem()] = &lossyFloat64Encoder{}
172+
extension[reflect2.TypeOfPtr((*float32)(nil)).Elem()] = &lossyFloat32Encoder{}
173+
extension[reflect2.TypeOfPtr((*float64)(nil)).Elem()] = &lossyFloat64Encoder{}
174174
}
175175

176176
type htmlEscapedStringEncoder struct {
@@ -186,7 +186,7 @@ func (encoder *htmlEscapedStringEncoder) IsEmpty(ptr unsafe.Pointer) bool {
186186
}
187187

188188
func (cfg *frozenConfig) escapeHTML(encoderExtension EncoderExtension) {
189-
encoderExtension[reflect.TypeOf((*string)(nil)).Elem()] = &htmlEscapedStringEncoder{}
189+
encoderExtension[reflect2.TypeOfPtr((*string)(nil)).Elem()] = &htmlEscapedStringEncoder{}
190190
}
191191

192192
func (cfg *frozenConfig) cleanDecoders() {

config_with_sync_map.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
package jsoniter
44

55
import (
6-
"reflect"
76
"sync"
87
)
98

@@ -26,23 +25,23 @@ func (cfg *frozenConfig) initCache() {
2625
cfg.encoderCache = sync.Map{}
2726
}
2827

29-
func (cfg *frozenConfig) addDecoderToCache(cacheKey reflect.Type, decoder ValDecoder) {
28+
func (cfg *frozenConfig) addDecoderToCache(cacheKey uintptr, decoder ValDecoder) {
3029
cfg.decoderCache.Store(cacheKey, decoder)
3130
}
3231

33-
func (cfg *frozenConfig) addEncoderToCache(cacheKey reflect.Type, encoder ValEncoder) {
32+
func (cfg *frozenConfig) addEncoderToCache(cacheKey uintptr, encoder ValEncoder) {
3433
cfg.encoderCache.Store(cacheKey, encoder)
3534
}
3635

37-
func (cfg *frozenConfig) getDecoderFromCache(cacheKey reflect.Type) ValDecoder {
36+
func (cfg *frozenConfig) getDecoderFromCache(cacheKey uintptr) ValDecoder {
3837
decoder, found := cfg.decoderCache.Load(cacheKey)
3938
if found {
4039
return decoder.(ValDecoder)
4140
}
4241
return nil
4342
}
4443

45-
func (cfg *frozenConfig) getEncoderFromCache(cacheKey reflect.Type) ValEncoder {
44+
func (cfg *frozenConfig) getEncoderFromCache(cacheKey uintptr) ValEncoder {
4645
encoder, found := cfg.encoderCache.Load(cacheKey)
4746
if found {
4847
return encoder.(ValEncoder)

config_without_sync_map.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,39 +15,39 @@ type frozenConfig struct {
1515
onlyTaggedField bool
1616
disallowUnknownFields bool
1717
cacheLock *sync.RWMutex
18-
decoderCache map[reflect.Type]ValDecoder
19-
encoderCache map[reflect.Type]ValEncoder
18+
decoderCache map[reflect2.Type]ValDecoder
19+
encoderCache map[reflect2.Type]ValEncoder
2020
extensions []Extension
2121
streamPool chan *Stream
2222
iteratorPool chan *Iterator
2323
}
2424

2525
func (cfg *frozenConfig) initCache() {
2626
cfg.cacheLock = &sync.RWMutex{}
27-
cfg.decoderCache = map[reflect.Type]ValDecoder{}
28-
cfg.encoderCache = map[reflect.Type]ValEncoder{}
27+
cfg.decoderCache = map[reflect2.Type]ValDecoder{}
28+
cfg.encoderCache = map[reflect2.Type]ValEncoder{}
2929
}
3030

31-
func (cfg *frozenConfig) addDecoderToCache(cacheKey reflect.Type, decoder ValDecoder) {
31+
func (cfg *frozenConfig) addDecoderToCache(cacheKey reflect2.Type, decoder ValDecoder) {
3232
cfg.cacheLock.Lock()
3333
cfg.decoderCache[cacheKey] = decoder
3434
cfg.cacheLock.Unlock()
3535
}
3636

37-
func (cfg *frozenConfig) addEncoderToCache(cacheKey reflect.Type, encoder ValEncoder) {
37+
func (cfg *frozenConfig) addEncoderToCache(cacheKey reflect2.Type, encoder ValEncoder) {
3838
cfg.cacheLock.Lock()
3939
cfg.encoderCache[cacheKey] = encoder
4040
cfg.cacheLock.Unlock()
4141
}
4242

43-
func (cfg *frozenConfig) getDecoderFromCache(cacheKey reflect.Type) ValDecoder {
43+
func (cfg *frozenConfig) getDecoderFromCache(cacheKey reflect2.Type) ValDecoder {
4444
cfg.cacheLock.RLock()
4545
decoder, _ := cfg.decoderCache[cacheKey].(ValDecoder)
4646
cfg.cacheLock.RUnlock()
4747
return decoder
4848
}
4949

50-
func (cfg *frozenConfig) getEncoderFromCache(cacheKey reflect.Type) ValEncoder {
50+
func (cfg *frozenConfig) getEncoderFromCache(cacheKey reflect2.Type) ValEncoder {
5151
cfg.cacheLock.RLock()
5252
encoder, _ := cfg.encoderCache[cacheKey].(ValEncoder)
5353
cfg.cacheLock.RUnlock()

extra/fuzzy_decoder.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"unsafe"
1010

1111
"github.com/json-iterator/go"
12+
"github.com/v2pro/plz/reflect2"
1213
)
1314

1415
const maxUint = ^uint(0)
@@ -148,7 +149,7 @@ type tolerateEmptyArrayExtension struct {
148149
jsoniter.DummyExtension
149150
}
150151

151-
func (extension *tolerateEmptyArrayExtension) DecorateDecoder(typ reflect.Type, decoder jsoniter.ValDecoder) jsoniter.ValDecoder {
152+
func (extension *tolerateEmptyArrayExtension) DecorateDecoder(typ reflect2.Type, decoder jsoniter.ValDecoder) jsoniter.ValDecoder {
152153
if typ.Kind() == reflect.Struct || typ.Kind() == reflect.Map {
153154
return &tolerateEmptyArrayDecoder{decoder}
154155
}

extra/naming_strategy.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ type namingStrategyExtension struct {
1717

1818
func (extension *namingStrategyExtension) UpdateStructDescriptor(structDescriptor *jsoniter.StructDescriptor) {
1919
for _, binding := range structDescriptor.Fields {
20-
binding.ToNames = []string{extension.translate(binding.Field.Name)}
21-
binding.FromNames = []string{extension.translate(binding.Field.Name)}
20+
binding.ToNames = []string{extension.translate(binding.Field.Name())}
21+
binding.FromNames = []string{extension.translate(binding.Field.Name())}
2222
}
2323
}
2424

extra/privat_fields.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ type privateFieldsExtension struct {
1616

1717
func (extension *privateFieldsExtension) UpdateStructDescriptor(structDescriptor *jsoniter.StructDescriptor) {
1818
for _, binding := range structDescriptor.Fields {
19-
isPrivate := unicode.IsLower(rune(binding.Field.Name[0]))
19+
isPrivate := unicode.IsLower(rune(binding.Field.Name()[0]))
2020
if isPrivate {
21-
binding.FromNames = []string{binding.Field.Name}
22-
binding.ToNames = []string{binding.Field.Name}
21+
binding.FromNames = []string{binding.Field.Name()}
22+
binding.ToNames = []string{binding.Field.Name()}
2323
}
2424
}
2525
}

reflect.go

Lines changed: 24 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ type checkIsEmpty interface {
3636
type ctx struct {
3737
*frozenConfig
3838
prefix string
39-
encoders map[reflect.Type]ValEncoder
40-
decoders map[reflect.Type]ValDecoder
39+
encoders map[reflect2.Type]ValEncoder
40+
decoders map[reflect2.Type]ValDecoder
4141
}
4242

4343
func (b *ctx) append(prefix string) *ctx {
@@ -51,7 +51,7 @@ func (b *ctx) append(prefix string) *ctx {
5151

5252
// ReadVal copy the underlying JSON into go interface, same as json.Unmarshal
5353
func (iter *Iterator) ReadVal(obj interface{}) {
54-
typ := reflect.TypeOf(obj)
54+
typ := reflect2.TypeOf(obj)
5555
if typ.Kind() != reflect.Ptr {
5656
iter.ReportError("ReadVal", "can only unmarshal into pointer")
5757
return
@@ -71,29 +71,30 @@ func (stream *Stream) WriteVal(val interface{}) {
7171
stream.WriteNil()
7272
return
7373
}
74-
typ := reflect.TypeOf(val)
74+
typ := reflect2.TypeOf(val)
7575
encoder := stream.cfg.EncoderOf(typ)
7676
encoder.Encode(reflect2.PtrOf(val), stream)
7777
}
7878

79-
func (cfg *frozenConfig) DecoderOf(typ reflect.Type) ValDecoder {
80-
cacheKey := typ
79+
func (cfg *frozenConfig) DecoderOf(typ reflect2.Type) ValDecoder {
80+
cacheKey := typ.RType()
8181
decoder := cfg.getDecoderFromCache(cacheKey)
8282
if decoder != nil {
8383
return decoder
8484
}
8585
ctx := &ctx{
8686
frozenConfig: cfg,
8787
prefix: "",
88-
decoders: map[reflect.Type]ValDecoder{},
89-
encoders: map[reflect.Type]ValEncoder{},
88+
decoders: map[reflect2.Type]ValDecoder{},
89+
encoders: map[reflect2.Type]ValEncoder{},
9090
}
91-
decoder = decoderOfType(ctx, typ.Elem())
91+
ptrType := typ.(*reflect2.UnsafePtrType)
92+
decoder = decoderOfType(ctx, ptrType.Elem())
9293
cfg.addDecoderToCache(cacheKey, decoder)
9394
return decoder
9495
}
9596

96-
func decoderOfType(ctx *ctx, typ reflect.Type) ValDecoder {
97+
func decoderOfType(ctx *ctx, typ reflect2.Type) ValDecoder {
9798
decoder := getTypeDecoderFromExtension(ctx, typ)
9899
if decoder != nil {
99100
return decoder
@@ -108,7 +109,7 @@ func decoderOfType(ctx *ctx, typ reflect.Type) ValDecoder {
108109
return decoder
109110
}
110111

111-
func createDecoderOfType(ctx *ctx, typ reflect.Type) ValDecoder {
112+
func createDecoderOfType(ctx *ctx, typ reflect2.Type) ValDecoder {
112113
decoder := ctx.decoders[typ]
113114
if decoder != nil {
114115
return decoder
@@ -120,7 +121,7 @@ func createDecoderOfType(ctx *ctx, typ reflect.Type) ValDecoder {
120121
return decoder
121122
}
122123

123-
func _createDecoderOfType(ctx *ctx, typ reflect.Type) ValDecoder {
124+
func _createDecoderOfType(ctx *ctx, typ reflect2.Type) ValDecoder {
124125
decoder := createDecoderOfJsonRawMessage(ctx, typ)
125126
if decoder != nil {
126127
return decoder
@@ -143,8 +144,8 @@ func _createDecoderOfType(ctx *ctx, typ reflect.Type) ValDecoder {
143144
}
144145
switch typ.Kind() {
145146
case reflect.Interface:
146-
if typ.NumMethod() > 0 {
147-
ifaceType := reflect2.Type2(typ).(*reflect2.UnsafeIFaceType)
147+
ifaceType, isIFace := typ.(*reflect2.UnsafeIFaceType)
148+
if isIFace {
148149
return &ifaceDecoder{valType: ifaceType}
149150
}
150151
return &efaceDecoder{}
@@ -163,20 +164,20 @@ func _createDecoderOfType(ctx *ctx, typ reflect.Type) ValDecoder {
163164
}
164165
}
165166

166-
func (cfg *frozenConfig) EncoderOf(typ reflect.Type) ValEncoder {
167-
cacheKey := typ
167+
func (cfg *frozenConfig) EncoderOf(typ reflect2.Type) ValEncoder {
168+
cacheKey := typ.RType()
168169
encoder := cfg.getEncoderFromCache(cacheKey)
169170
if encoder != nil {
170171
return encoder
171172
}
172173
ctx := &ctx{
173174
frozenConfig: cfg,
174175
prefix: "",
175-
decoders: map[reflect.Type]ValDecoder{},
176-
encoders: map[reflect.Type]ValEncoder{},
176+
decoders: map[reflect2.Type]ValDecoder{},
177+
encoders: map[reflect2.Type]ValEncoder{},
177178
}
178179
encoder = encoderOfType(ctx, typ)
179-
if shouldFixOnePtr(typ) {
180+
if typ.LikePtr() {
180181
encoder = &onePtrEncoder{encoder}
181182
}
182183
cfg.addEncoderToCache(cacheKey, encoder)
@@ -195,11 +196,7 @@ func (encoder *onePtrEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
195196
encoder.encoder.Encode(unsafe.Pointer(&ptr), stream)
196197
}
197198

198-
func shouldFixOnePtr(typ reflect.Type) bool {
199-
return reflect2.Type2(typ).LikePtr()
200-
}
201-
202-
func encoderOfType(ctx *ctx, typ reflect.Type) ValEncoder {
199+
func encoderOfType(ctx *ctx, typ reflect2.Type) ValEncoder {
203200
encoder := getTypeEncoderFromExtension(ctx, typ)
204201
if encoder != nil {
205202
return encoder
@@ -214,7 +211,7 @@ func encoderOfType(ctx *ctx, typ reflect.Type) ValEncoder {
214211
return encoder
215212
}
216213

217-
func createEncoderOfType(ctx *ctx, typ reflect.Type) ValEncoder {
214+
func createEncoderOfType(ctx *ctx, typ reflect2.Type) ValEncoder {
218215
encoder := ctx.encoders[typ]
219216
if encoder != nil {
220217
return encoder
@@ -225,7 +222,7 @@ func createEncoderOfType(ctx *ctx, typ reflect.Type) ValEncoder {
225222
placeholder.encoder = encoder
226223
return encoder
227224
}
228-
func _createEncoderOfType(ctx *ctx, typ reflect.Type) ValEncoder {
225+
func _createEncoderOfType(ctx *ctx, typ reflect2.Type) ValEncoder {
229226
encoder := createEncoderOfJsonRawMessage(ctx, typ)
230227
if encoder != nil {
231228
return encoder
@@ -249,7 +246,7 @@ func _createEncoderOfType(ctx *ctx, typ reflect.Type) ValEncoder {
249246
kind := typ.Kind()
250247
switch kind {
251248
case reflect.Interface:
252-
return &dynamicEncoder{reflect2.Type2(typ)}
249+
return &dynamicEncoder{typ}
253250
case reflect.Struct:
254251
return encoderOfStruct(ctx, typ)
255252
case reflect.Array:

0 commit comments

Comments
 (0)