1
0
mirror of https://github.com/json-iterator/go.git synced 2025-04-20 11:28:49 +02:00

fix any codec

This commit is contained in:
Tao Wen 2018-02-18 22:57:01 +08:00
parent d8e64aa825
commit 5a696808d6
2 changed files with 35 additions and 6 deletions

View File

@ -79,7 +79,7 @@ func (stream *Stream) WriteVal(val interface{}) {
} }
typ := reflect.TypeOf(val) typ := reflect.TypeOf(val)
encoder := stream.cfg.EncoderOf(typ) encoder := stream.cfg.EncoderOf(typ)
encoder.Encode((*emptyInterface)(unsafe.Pointer(&val)).word, stream) encoder.Encode(reflect2.PtrOf(val), stream)
} }
func decoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) ValDecoder { func decoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) ValDecoder {
@ -150,6 +150,9 @@ func createDecoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) Val
sliceDecoder := decoderOfSlice(cfg, prefix, typ) sliceDecoder := decoderOfSlice(cfg, prefix, typ)
return &base64Codec{sliceDecoder: sliceDecoder} return &base64Codec{sliceDecoder: sliceDecoder}
} }
if typ == anyType {
return &directAnyCodec{}
}
if typ.Implements(anyType) { if typ.Implements(anyType) {
return &anyCodec{} return &anyCodec{}
} }
@ -383,8 +386,13 @@ func createEncoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) Val
if typ.Kind() == reflect.Slice && typ.Elem().Kind() == reflect.Uint8 { if typ.Kind() == reflect.Slice && typ.Elem().Kind() == reflect.Uint8 {
return &base64Codec{} return &base64Codec{}
} }
if typ == anyType {
return &directAnyCodec{}
}
if typ.Implements(anyType) { if typ.Implements(anyType) {
return &anyCodec{} return &anyCodec{
valType: reflect2.Type2(typ),
}
} }
return createEncoderOfSimpleType(cfg, prefix, typ) return createEncoderOfSimpleType(cfg, prefix, typ)
} }

View File

@ -369,20 +369,41 @@ func (encoder *dynamicEncoder) IsEmpty(ptr unsafe.Pointer) bool {
return encoder.valType.UnsafeIndirect(ptr) == nil return encoder.valType.UnsafeIndirect(ptr) == nil
} }
type anyCodec struct { type anyCodec struct {
valType reflect2.Type
} }
func (codec *anyCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { func (codec *anyCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {
*((*Any)(ptr)) = iter.ReadAny() panic("not implemented")
} }
func (codec *anyCodec) Encode(ptr unsafe.Pointer, stream *Stream) { func (codec *anyCodec) Encode(ptr unsafe.Pointer, stream *Stream) {
(*((*Any)(ptr))).WriteTo(stream) obj := codec.valType.UnsafeIndirect(ptr)
any := obj.(Any)
any.WriteTo(stream)
} }
func (codec *anyCodec) IsEmpty(ptr unsafe.Pointer) bool { func (codec *anyCodec) IsEmpty(ptr unsafe.Pointer) bool {
return (*((*Any)(ptr))).Size() == 0 obj := codec.valType.UnsafeIndirect(ptr)
any := obj.(Any)
return any.Size() == 0
}
type directAnyCodec struct {
}
func (codec *directAnyCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {
*(*Any)(ptr) = iter.readAny()
}
func (codec *directAnyCodec) Encode(ptr unsafe.Pointer, stream *Stream) {
any := *(*Any)(ptr)
any.WriteTo(stream)
}
func (codec *directAnyCodec) IsEmpty(ptr unsafe.Pointer) bool {
any := *(*Any)(ptr)
return any.Size() == 0
} }
type jsonNumberCodec struct { type jsonNumberCodec struct {