From b79587753bcb0b6a98a8dde9d470ce9f24a14e86 Mon Sep 17 00:00:00 2001 From: Tao Wen Date: Tue, 20 Feb 2018 23:04:04 +0800 Subject: [PATCH] move any codec --- any.go | 28 +++++++++++++++++++++++- reflect.go | 64 ++++++++++++++++++++++-------------------------------- 2 files changed, 53 insertions(+), 39 deletions(-) diff --git a/any.go b/any.go index 77b9c86..1b237ed 100644 --- a/any.go +++ b/any.go @@ -245,6 +245,32 @@ func locatePath(iter *Iterator, path []interface{}) Any { return iter.readAny() } +var anyType = reflect.TypeOf((*Any)(nil)).Elem() + +func createDecoderOfAny(cfg *frozenConfig, prefix string, typ reflect.Type) ValDecoder { + if typ == anyType { + return &directAnyCodec{} + } + if typ.Implements(anyType) { + return &anyCodec{ + valType: reflect2.Type2(typ), + } + } + return nil +} + +func createEncoderOfAny(cfg *frozenConfig, prefix string, typ reflect.Type) ValEncoder { + if typ == anyType { + return &directAnyCodec{} + } + if typ.Implements(anyType) { + return &anyCodec{ + valType: reflect2.Type2(typ), + } + } + return nil +} + type anyCodec struct { valType reflect2.Type } @@ -280,4 +306,4 @@ func (codec *directAnyCodec) Encode(ptr unsafe.Pointer, stream *Stream) { func (codec *directAnyCodec) IsEmpty(ptr unsafe.Pointer) bool { any := *(*Any)(ptr) return any.Size() == 0 -} \ No newline at end of file +} diff --git a/reflect.go b/reflect.go index a05da8e..5e23276 100644 --- a/reflect.go +++ b/reflect.go @@ -38,7 +38,6 @@ type checkIsEmpty interface { var jsonRawMessageType reflect.Type var jsoniterRawMessageType reflect.Type -var anyType reflect.Type var marshalerType reflect.Type var unmarshalerType reflect.Type var textMarshalerType reflect.Type @@ -47,7 +46,6 @@ var textUnmarshalerType reflect.Type func init() { jsonRawMessageType = reflect.TypeOf((*json.RawMessage)(nil)).Elem() jsoniterRawMessageType = reflect.TypeOf((*RawMessage)(nil)).Elem() - anyType = reflect.TypeOf((*Any)(nil)).Elem() marshalerType = reflect.TypeOf((*json.Marshaler)(nil)).Elem() unmarshalerType = reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() textMarshalerType = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem() @@ -105,7 +103,6 @@ func decoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) ValDecode } func createDecoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) ValDecoder { - typeName := typ.String() decoder := createDecoderOfJsonRawMessage(cfg, prefix, typ) if decoder != nil { return decoder @@ -118,11 +115,9 @@ func createDecoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) Val if decoder != nil { return decoder } - if typ == anyType { - return &directAnyCodec{} - } - if typ.Implements(anyType) { - return &anyCodec{} + decoder = createDecoderOfAny(cfg, prefix, typ) + if decoder != nil { + return decoder } decoder = createDecoderOfNative(cfg, prefix, typ) if decoder != nil { @@ -230,15 +225,31 @@ func createEncoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) Val if encoder != nil { return encoder } - if typ == anyType { - return &directAnyCodec{} + encoder = createEncoderOfAny(cfg, prefix, typ) + if encoder != nil { + return encoder } - if typ.Implements(anyType) { - return &anyCodec{ - valType: reflect2.Type2(typ), - } + encoder = createEncoderOfNative(cfg, prefix, typ) + if encoder != nil { + return encoder + } + kind := typ.Kind() + switch kind { + case reflect.Interface: + return &dynamicEncoder{reflect2.Type2(typ)} + case reflect.Struct: + return encoderOfStruct(cfg, prefix, typ) + case reflect.Array: + return encoderOfArray(cfg, prefix, typ) + case reflect.Slice: + return encoderOfSlice(cfg, prefix, typ) + case reflect.Map: + return encoderOfMap(cfg, prefix, typ) + case reflect.Ptr: + return encoderOfOptional(cfg, prefix, typ) + default: + return &lazyErrorEncoder{err: fmt.Errorf("%s%s is unsupported type", prefix, typ.String())} } - return createEncoderOfSimpleType(cfg, prefix, typ) } func createCheckIsEmpty(cfg *frozenConfig, typ reflect.Type) checkIsEmpty { @@ -291,29 +302,6 @@ func createCheckIsEmpty(cfg *frozenConfig, typ reflect.Type) checkIsEmpty { } } -func createEncoderOfSimpleType(cfg *frozenConfig, prefix string, typ reflect.Type) ValEncoder { - encoder := createEncoderOfNative(cfg, prefix, typ) - if encoder != nil { - return encoder - } - kind := typ.Kind() - switch kind { - case reflect.Interface: - return &dynamicEncoder{reflect2.Type2(typ)} - case reflect.Struct: - return encoderOfStruct(cfg, prefix, typ) - case reflect.Array: - return encoderOfArray(cfg, prefix, typ) - case reflect.Slice: - return encoderOfSlice(cfg, prefix, typ) - case reflect.Map: - return encoderOfMap(cfg, prefix, typ) - case reflect.Ptr: - return encoderOfOptional(cfg, prefix, typ) - default: - return &lazyErrorEncoder{err: fmt.Errorf("%s%s is unsupported type", prefix, typ.String())} - } -} type placeholderDecoder struct { cfg *frozenConfig