4 "github.com/modern-go/reflect2"
9 type dynamicEncoder struct {
13 func (encoder *dynamicEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
14 obj := encoder.valType.UnsafeIndirect(ptr)
18 func (encoder *dynamicEncoder) IsEmpty(ptr unsafe.Pointer) bool {
19 return encoder.valType.UnsafeIndirect(ptr) == nil
22 type efaceDecoder struct {
25 func (decoder *efaceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
26 pObj := (*interface{})(ptr)
32 typ := reflect2.TypeOf(obj)
33 if typ.Kind() != reflect.Ptr {
37 ptrType := typ.(*reflect2.UnsafePtrType)
38 ptrElemType := ptrType.Elem()
39 if iter.WhatIsNext() == NilValue {
40 if ptrElemType.Kind() != reflect.Ptr {
41 iter.skipFourBytes('n', 'u', 'l', 'l')
46 if reflect2.IsNil(obj) {
47 obj := ptrElemType.New()
55 type ifaceDecoder struct {
56 valType *reflect2.UnsafeIFaceType
59 func (decoder *ifaceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
61 decoder.valType.UnsafeSet(ptr, decoder.valType.UnsafeNew())
64 obj := decoder.valType.UnsafeIndirect(ptr)
65 if reflect2.IsNil(obj) {
66 iter.ReportError("decode non empty interface", "can not unmarshal into nil")