1package jsoniter 2 3import ( 4 "github.com/modern-go/reflect2" 5 "reflect" 6 "unsafe" 7) 8 9type dynamicEncoder struct { 10 valType reflect2.Type 11} 12 13func (encoder *dynamicEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { 14 obj := encoder.valType.UnsafeIndirect(ptr) 15 stream.WriteVal(obj) 16} 17 18func (encoder *dynamicEncoder) IsEmpty(ptr unsafe.Pointer) bool { 19 return encoder.valType.UnsafeIndirect(ptr) == nil 20} 21 22type efaceDecoder struct { 23} 24 25func (decoder *efaceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { 26 pObj := (*interface{})(ptr) 27 obj := *pObj 28 if obj == nil { 29 *pObj = iter.Read() 30 return 31 } 32 typ := reflect2.TypeOf(obj) 33 if typ.Kind() != reflect.Ptr { 34 *pObj = iter.Read() 35 return 36 } 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') 42 *pObj = nil 43 return 44 } 45 } 46 if reflect2.IsNil(obj) { 47 obj := ptrElemType.New() 48 iter.ReadVal(obj) 49 *pObj = obj 50 return 51 } 52 iter.ReadVal(obj) 53} 54 55type ifaceDecoder struct { 56 valType *reflect2.UnsafeIFaceType 57} 58 59func (decoder *ifaceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { 60 if iter.ReadNil() { 61 decoder.valType.UnsafeSet(ptr, decoder.valType.UnsafeNew()) 62 return 63 } 64 obj := decoder.valType.UnsafeIndirect(ptr) 65 if reflect2.IsNil(obj) { 66 iter.ReportError("decode non empty interface", "can not unmarshal into nil") 67 return 68 } 69 iter.ReadVal(obj) 70} 71