jsoniter_reflect.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. package jsoniter
  2. import (
  3. "reflect"
  4. "errors"
  5. "fmt"
  6. "unsafe"
  7. "sync/atomic"
  8. )
  9. type Decoder interface {
  10. decode(ptr unsafe.Pointer, iter *Iterator)
  11. }
  12. type stringDecoder struct {
  13. }
  14. func (decoder *stringDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  15. *((*string)(ptr)) = iter.ReadString()
  16. }
  17. type optionalDecoder struct {
  18. valueType reflect.Type
  19. valueDecoder Decoder
  20. }
  21. func (decoder *optionalDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  22. if iter.ReadNull() {
  23. *((*unsafe.Pointer)(ptr)) = nil
  24. } else {
  25. value := reflect.New(decoder.valueType)
  26. decoder.valueDecoder.decode(unsafe.Pointer(value.Pointer()), iter)
  27. *((*uintptr)(ptr)) = value.Pointer()
  28. }
  29. }
  30. type structDecoder struct {
  31. fields map[string]Decoder
  32. }
  33. func (decoder *structDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  34. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  35. fieldDecoder := decoder.fields[field]
  36. if fieldDecoder == nil {
  37. iter.Skip()
  38. } else {
  39. fieldDecoder.decode(ptr, iter)
  40. }
  41. }
  42. }
  43. type structFieldDecoder struct {
  44. offset uintptr
  45. fieldDecoder Decoder
  46. }
  47. func (decoder *structFieldDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  48. fieldPtr := uintptr(ptr) + decoder.offset
  49. decoder.fieldDecoder.decode(unsafe.Pointer(fieldPtr), iter)
  50. }
  51. type sliceDecoder struct {
  52. sliceType reflect.Type
  53. elemType reflect.Type
  54. elemDecoder Decoder
  55. }
  56. // sliceHeader is a safe version of SliceHeader used within this package.
  57. type sliceHeader struct {
  58. Data unsafe.Pointer
  59. Len int
  60. Cap int
  61. }
  62. func (decoder *sliceDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  63. slice := (*sliceHeader)(ptr)
  64. slice.Len = 0
  65. for iter.ReadArray() {
  66. offset := uintptr(slice.Len) * decoder.elemType.Size()
  67. growOne(slice, decoder.sliceType, decoder.elemType)
  68. dataPtr := uintptr(slice.Data) + offset
  69. decoder.elemDecoder.decode(unsafe.Pointer(dataPtr), iter)
  70. }
  71. }
  72. // grow grows the slice s so that it can hold extra more values, allocating
  73. // more capacity if needed. It also returns the old and new slice lengths.
  74. func growOne(slice *sliceHeader, sliceType reflect.Type, elementType reflect.Type) {
  75. newLen := slice.Len + 1
  76. if newLen <= slice.Cap {
  77. slice.Len = newLen
  78. return
  79. }
  80. newCap := slice.Cap
  81. if newCap == 0 {
  82. newCap = 1
  83. } else {
  84. for newCap < newLen {
  85. if slice.Len < 1024 {
  86. newCap += newCap
  87. } else {
  88. newCap += newCap / 4
  89. }
  90. }
  91. }
  92. dst := unsafe.Pointer(reflect.MakeSlice(sliceType, newLen, newCap).Pointer())
  93. originalBytesCount := uintptr(slice.Len) * elementType.Size()
  94. srcPtr := (*[1<<30]byte)(slice.Data)
  95. dstPtr := (*[1<<30]byte)(dst)
  96. for i := uintptr(0); i < originalBytesCount; i++ {
  97. dstPtr[i] = srcPtr[i]
  98. }
  99. slice.Len = newLen
  100. slice.Cap = newCap
  101. slice.Data = dst
  102. }
  103. var DECODER_STRING *stringDecoder
  104. var DECODERS unsafe.Pointer
  105. func addDecoderToCache(cacheKey string, decoder Decoder) {
  106. retry := true
  107. for retry {
  108. ptr := atomic.LoadPointer(&DECODERS)
  109. cache := *(*map[string]Decoder)(ptr)
  110. copy := map[string]Decoder{}
  111. for k, v := range cache {
  112. copy[k] = v
  113. }
  114. copy[cacheKey] = decoder
  115. retry = !atomic.CompareAndSwapPointer(&DECODERS, ptr, unsafe.Pointer(&copy))
  116. }
  117. }
  118. func getDecoderFromCache(cacheKey string) Decoder {
  119. ptr := atomic.LoadPointer(&DECODERS)
  120. cache := *(*map[string]Decoder)(ptr)
  121. return cache[cacheKey]
  122. }
  123. func init() {
  124. DECODER_STRING = &stringDecoder{}
  125. atomic.StorePointer(&DECODERS, unsafe.Pointer(&map[string]Decoder{}))
  126. }
  127. // emptyInterface is the header for an interface{} value.
  128. type emptyInterface struct {
  129. typ *struct{}
  130. word unsafe.Pointer
  131. }
  132. func (iter *Iterator) Read(obj interface{}) {
  133. type_ := reflect.TypeOf(obj)
  134. cacheKey := type_.String()
  135. cachedDecoder := getDecoderFromCache(cacheKey)
  136. if cachedDecoder == nil {
  137. decoder, err := decoderOfType(type_)
  138. if err != nil {
  139. iter.Error = err
  140. return
  141. }
  142. cachedDecoder = decoder
  143. addDecoderToCache(cacheKey, decoder)
  144. }
  145. e := (*emptyInterface)(unsafe.Pointer(&obj))
  146. cachedDecoder.decode(e.word, iter)
  147. }
  148. type prefix string
  149. func (p prefix) addTo(decoder Decoder, err error) (Decoder, error) {
  150. if err != nil {
  151. return nil, fmt.Errorf("%s: %s", p, err.Error())
  152. }
  153. return decoder, err
  154. }
  155. func decoderOfType(type_ reflect.Type) (Decoder, error) {
  156. switch type_.Kind() {
  157. case reflect.Ptr:
  158. return prefix("ptr").addTo(decoderOfPtr(type_.Elem()))
  159. default:
  160. return nil, errors.New("expect ptr")
  161. }
  162. }
  163. func decoderOfPtr(type_ reflect.Type) (Decoder, error) {
  164. switch type_.Kind() {
  165. case reflect.String:
  166. return DECODER_STRING, nil
  167. case reflect.Struct:
  168. return decoderOfStruct(type_)
  169. case reflect.Slice:
  170. return decoderOfSlice(type_)
  171. case reflect.Ptr:
  172. return prefix("optional").addTo(decoderOfOptional(type_.Elem()))
  173. default:
  174. return nil, errors.New("expect string, struct, slice")
  175. }
  176. }
  177. func decoderOfOptional(type_ reflect.Type) (Decoder, error) {
  178. switch type_.Kind() {
  179. case reflect.String:
  180. return &optionalDecoder{type_, DECODER_STRING}, nil
  181. default:
  182. return nil, errors.New("expect string")
  183. }
  184. }
  185. func decoderOfStruct(type_ reflect.Type) (Decoder, error) {
  186. fields := map[string]Decoder{}
  187. for i := 0; i < type_.NumField(); i++ {
  188. field := type_.Field(i)
  189. decoder, err := decoderOfPtr(field.Type)
  190. if err != nil {
  191. return prefix(fmt.Sprintf("{%s}", field.Name)).addTo(decoder, err)
  192. }
  193. fields[field.Name] = &structFieldDecoder{field.Offset, decoder}
  194. }
  195. return &structDecoder{fields}, nil
  196. }
  197. func decoderOfSlice(type_ reflect.Type) (Decoder, error) {
  198. decoder, err := decoderOfPtr(type_.Elem())
  199. if err != nil {
  200. return prefix("[elem]").addTo(decoder, err)
  201. }
  202. return &sliceDecoder{type_, type_.Elem(), decoder}, nil
  203. }