reflect_dynamic.go (1458B)
1 package jsoniter 2 3 import ( 4 "github.com/modern-go/reflect2" 5 "reflect" 6 "unsafe" 7 ) 8 9 type dynamicEncoder struct { 10 valType reflect2.Type 11 } 12 13 func (encoder *dynamicEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { 14 obj := encoder.valType.UnsafeIndirect(ptr) 15 stream.WriteVal(obj) 16 } 17 18 func (encoder *dynamicEncoder) IsEmpty(ptr unsafe.Pointer) bool { 19 return encoder.valType.UnsafeIndirect(ptr) == nil 20 } 21 22 type efaceDecoder struct { 23 } 24 25 func (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 55 type ifaceDecoder struct { 56 valType *reflect2.UnsafeIFaceType 57 } 58 59 func (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 }