Skip to content
This repository was archived by the owner on Dec 15, 2025. It is now read-only.

Commit 404d907

Browse files
committed
move type declaration into separate files
1 parent b795877 commit 404d907

File tree

5 files changed

+61
-110
lines changed

5 files changed

+61
-110
lines changed

reflect.go

Lines changed: 1 addition & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -36,22 +36,6 @@ type checkIsEmpty interface {
3636
IsEmpty(ptr unsafe.Pointer) bool
3737
}
3838

39-
var jsonRawMessageType reflect.Type
40-
var jsoniterRawMessageType reflect.Type
41-
var marshalerType reflect.Type
42-
var unmarshalerType reflect.Type
43-
var textMarshalerType reflect.Type
44-
var textUnmarshalerType reflect.Type
45-
46-
func init() {
47-
jsonRawMessageType = reflect.TypeOf((*json.RawMessage)(nil)).Elem()
48-
jsoniterRawMessageType = reflect.TypeOf((*RawMessage)(nil)).Elem()
49-
marshalerType = reflect.TypeOf((*json.Marshaler)(nil)).Elem()
50-
unmarshalerType = reflect.TypeOf((*json.Unmarshaler)(nil)).Elem()
51-
textMarshalerType = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem()
52-
textUnmarshalerType = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem()
53-
}
54-
5539
// ReadVal copy the underlying JSON into go interface, same as json.Unmarshal
5640
func (iter *Iterator) ReadVal(obj interface{}) {
5741
typ := reflect.TypeOf(obj)
@@ -171,30 +155,7 @@ func (encoder *onePtrEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
171155
}
172156

173157
func shouldFixOnePtr(typ reflect.Type) bool {
174-
if isPtrKind(typ.Kind()) {
175-
return true
176-
}
177-
if typ.Kind() == reflect.Struct {
178-
if typ.NumField() != 1 {
179-
return false
180-
}
181-
return shouldFixOnePtr(typ.Field(0).Type)
182-
}
183-
if typ.Kind() == reflect.Array {
184-
if typ.Len() != 1 {
185-
return false
186-
}
187-
return shouldFixOnePtr(typ.Elem())
188-
}
189-
return false
190-
}
191-
192-
func isPtrKind(kind reflect.Kind) bool {
193-
switch kind {
194-
case reflect.Ptr, reflect.Map, reflect.Chan, reflect.Func:
195-
return true
196-
}
197-
return false
158+
return reflect2.Type2(typ).LikePtr()
198159
}
199160

200161
func encoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) ValEncoder {
@@ -252,76 +213,6 @@ func createEncoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) Val
252213
}
253214
}
254215

255-
func createCheckIsEmpty(cfg *frozenConfig, typ reflect.Type) checkIsEmpty {
256-
kind := typ.Kind()
257-
switch kind {
258-
case reflect.String:
259-
return &stringCodec{}
260-
case reflect.Int:
261-
return &intCodec{}
262-
case reflect.Int8:
263-
return &int8Codec{}
264-
case reflect.Int16:
265-
return &int16Codec{}
266-
case reflect.Int32:
267-
return &int32Codec{}
268-
case reflect.Int64:
269-
return &int64Codec{}
270-
case reflect.Uint:
271-
return &uintCodec{}
272-
case reflect.Uint8:
273-
return &uint8Codec{}
274-
case reflect.Uint16:
275-
return &uint16Codec{}
276-
case reflect.Uint32:
277-
return &uint32Codec{}
278-
case reflect.Uintptr:
279-
return &uintptrCodec{}
280-
case reflect.Uint64:
281-
return &uint64Codec{}
282-
case reflect.Float32:
283-
return &float32Codec{}
284-
case reflect.Float64:
285-
return &float64Codec{}
286-
case reflect.Bool:
287-
return &boolCodec{}
288-
case reflect.Interface:
289-
return &dynamicEncoder{reflect2.Type2(typ)}
290-
case reflect.Struct:
291-
return &structEncoder{typ: typ}
292-
case reflect.Array:
293-
return &arrayEncoder{}
294-
case reflect.Slice:
295-
return &sliceEncoder{}
296-
case reflect.Map:
297-
return encoderOfMap(cfg, "", typ)
298-
case reflect.Ptr:
299-
return &OptionalEncoder{}
300-
default:
301-
return &lazyErrorEncoder{err: fmt.Errorf("unsupported type: %v", typ)}
302-
}
303-
}
304-
305-
306-
type placeholderDecoder struct {
307-
cfg *frozenConfig
308-
cacheKey reflect.Type
309-
}
310-
311-
func (decoder *placeholderDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
312-
for i := 0; i < 500; i++ {
313-
realDecoder := decoder.cfg.getDecoderFromCache(decoder.cacheKey)
314-
_, isPlaceholder := realDecoder.(*placeholderDecoder)
315-
if isPlaceholder {
316-
time.Sleep(10 * time.Millisecond)
317-
} else {
318-
realDecoder.Decode(ptr, iter)
319-
return
320-
}
321-
}
322-
panic(fmt.Sprintf("real decoder not found for cache key: %v", decoder.cacheKey))
323-
}
324-
325216
type lazyErrorDecoder struct {
326217
err error
327218
}

reflect_json_raw_message.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ import (
66
"reflect"
77
)
88

9+
var jsonRawMessageType = reflect.TypeOf((*json.RawMessage)(nil)).Elem()
10+
var jsoniterRawMessageType = reflect.TypeOf((*RawMessage)(nil)).Elem()
11+
912
func createEncoderOfJsonRawMessage(cfg *frozenConfig, prefix string, typ reflect.Type) ValEncoder {
1013
if typ == jsonRawMessageType {
1114
return &jsonRawMessageCodec{}

reflect_marshaler.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ import (
88
"reflect"
99
)
1010

11+
var marshalerType = reflect.TypeOf((*json.Marshaler)(nil)).Elem()
12+
var unmarshalerType = reflect.TypeOf((*json.Unmarshaler)(nil)).Elem()
13+
var textMarshalerType = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem()
14+
var textUnmarshalerType = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem()
15+
1116
func createDecoderOfMarshaler(cfg *frozenConfig, prefix string, typ reflect.Type) ValDecoder {
1217
ptrType := reflect.PtrTo(typ)
1318
if ptrType.Implements(unmarshalerType) {

reflect_optional.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ func (decoder *OptionalDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
2828
*((*unsafe.Pointer)(ptr)) = nil
2929
} else {
3030
if *((*unsafe.Pointer)(ptr)) == nil {
31+
// TODO: use reflect2 instead
3132
//pointer to null, we have to allocate memory to hold the value
3233
value := reflect.New(decoder.ValueType)
3334
newPtr := extractInterface(value.Interface()).word

reflect_struct_encoder.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"io"
66
"reflect"
77
"unsafe"
8+
"github.com/v2pro/plz/reflect2"
89
)
910

1011
func encoderOfStruct(cfg *frozenConfig, prefix string, typ reflect.Type) ValEncoder {
@@ -45,6 +46,56 @@ func encoderOfStruct(cfg *frozenConfig, prefix string, typ reflect.Type) ValEnco
4546
return &structEncoder{typ, finalOrderedFields}
4647
}
4748

49+
func createCheckIsEmpty(cfg *frozenConfig, typ reflect.Type) checkIsEmpty {
50+
kind := typ.Kind()
51+
switch kind {
52+
case reflect.String:
53+
return &stringCodec{}
54+
case reflect.Int:
55+
return &intCodec{}
56+
case reflect.Int8:
57+
return &int8Codec{}
58+
case reflect.Int16:
59+
return &int16Codec{}
60+
case reflect.Int32:
61+
return &int32Codec{}
62+
case reflect.Int64:
63+
return &int64Codec{}
64+
case reflect.Uint:
65+
return &uintCodec{}
66+
case reflect.Uint8:
67+
return &uint8Codec{}
68+
case reflect.Uint16:
69+
return &uint16Codec{}
70+
case reflect.Uint32:
71+
return &uint32Codec{}
72+
case reflect.Uintptr:
73+
return &uintptrCodec{}
74+
case reflect.Uint64:
75+
return &uint64Codec{}
76+
case reflect.Float32:
77+
return &float32Codec{}
78+
case reflect.Float64:
79+
return &float64Codec{}
80+
case reflect.Bool:
81+
return &boolCodec{}
82+
case reflect.Interface:
83+
return &dynamicEncoder{reflect2.Type2(typ)}
84+
case reflect.Struct:
85+
return &structEncoder{typ: typ}
86+
case reflect.Array:
87+
return &arrayEncoder{}
88+
case reflect.Slice:
89+
return &sliceEncoder{}
90+
case reflect.Map:
91+
return encoderOfMap(cfg, "", typ)
92+
case reflect.Ptr:
93+
return &OptionalEncoder{}
94+
default:
95+
return &lazyErrorEncoder{err: fmt.Errorf("unsupported type: %v", typ)}
96+
}
97+
}
98+
4899
func resolveConflictBinding(cfg *frozenConfig, old, new *Binding) (ignoreOld, ignoreNew bool) {
49100
newTagged := new.Field.Tag.Get(cfg.getTagKey()) != ""
50101
oldTagged := old.Field.Tag.Get(cfg.getTagKey()) != ""

0 commit comments

Comments
 (0)