feature_reflect.go 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. package jsoniter
  2. import (
  3. "errors"
  4. "fmt"
  5. "io"
  6. "reflect"
  7. "strconv"
  8. "sync/atomic"
  9. "unsafe"
  10. )
  11. /*
  12. Reflection on type to create decoders, which is then cached
  13. Reflection on value is avoided as we can, as the reflect.Value itself will allocate, with following exceptions
  14. 1. create instance of new value, for example *int will need a int to be allocated
  15. 2. append to slice, if the existing cap is not enough, allocate will be done using Reflect.New
  16. 3. assignment to map, both key and value will be reflect.Value
  17. For a simple struct binding, it will be reflect.Value free and allocation free
  18. */
  19. // Decoder works like a father class for sub-type decoders
  20. type Decoder interface {
  21. decode(ptr unsafe.Pointer, iter *Iterator)
  22. }
  23. type DecoderFunc func(ptr unsafe.Pointer, iter *Iterator)
  24. type ExtensionFunc func(typ reflect.Type, field *reflect.StructField) ([]string, DecoderFunc)
  25. type funcDecoder struct {
  26. fun DecoderFunc
  27. }
  28. func (decoder *funcDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  29. decoder.fun(ptr, iter)
  30. }
  31. var DECODERS unsafe.Pointer
  32. var typeDecoders map[string]Decoder
  33. var fieldDecoders map[string]Decoder
  34. var extensions []ExtensionFunc
  35. func init() {
  36. typeDecoders = map[string]Decoder{}
  37. fieldDecoders = map[string]Decoder{}
  38. extensions = []ExtensionFunc{}
  39. atomic.StorePointer(&DECODERS, unsafe.Pointer(&map[string]Decoder{}))
  40. }
  41. func addDecoderToCache(cacheKey reflect.Type, decoder Decoder) {
  42. retry := true
  43. for retry {
  44. ptr := atomic.LoadPointer(&DECODERS)
  45. cache := *(*map[reflect.Type]Decoder)(ptr)
  46. copy := map[reflect.Type]Decoder{}
  47. for k, v := range cache {
  48. copy[k] = v
  49. }
  50. copy[cacheKey] = decoder
  51. retry = !atomic.CompareAndSwapPointer(&DECODERS, ptr, unsafe.Pointer(&copy))
  52. }
  53. }
  54. func getDecoderFromCache(cacheKey reflect.Type) Decoder {
  55. ptr := atomic.LoadPointer(&DECODERS)
  56. cache := *(*map[reflect.Type]Decoder)(ptr)
  57. return cache[cacheKey]
  58. }
  59. // RegisterTypeDecoder can register a type for json object
  60. func RegisterTypeDecoder(typ string, fun DecoderFunc) {
  61. typeDecoders[typ] = &funcDecoder{fun}
  62. }
  63. // RegisterFieldDecoder can register a type for json field
  64. func RegisterFieldDecoder(typ string, field string, fun DecoderFunc) {
  65. fieldDecoders[fmt.Sprintf("%s/%s", typ, field)] = &funcDecoder{fun}
  66. }
  67. // RegisterExtension can register a custom extension
  68. func RegisterExtension(extension ExtensionFunc) {
  69. extensions = append(extensions, extension)
  70. }
  71. // CleanDecoders cleans decoders registered
  72. func CleanDecoders() {
  73. typeDecoders = map[string]Decoder{}
  74. fieldDecoders = map[string]Decoder{}
  75. }
  76. type optionalDecoder struct {
  77. valueType reflect.Type
  78. valueDecoder Decoder
  79. }
  80. func (decoder *optionalDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  81. if iter.ReadNil() {
  82. *((*unsafe.Pointer)(ptr)) = nil
  83. } else {
  84. if *((*unsafe.Pointer)(ptr)) == nil {
  85. // pointer to null, we have to allocate memory to hold the value
  86. value := reflect.New(decoder.valueType)
  87. decoder.valueDecoder.decode(unsafe.Pointer(value.Pointer()), iter)
  88. *((*uintptr)(ptr)) = value.Pointer()
  89. } else {
  90. // reuse existing instance
  91. decoder.valueDecoder.decode(*((*unsafe.Pointer)(ptr)), iter)
  92. }
  93. }
  94. }
  95. type mapDecoder struct {
  96. mapType reflect.Type
  97. elemType reflect.Type
  98. elemDecoder Decoder
  99. mapInterface emptyInterface
  100. }
  101. func (decoder *mapDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  102. // dark magic to cast unsafe.Pointer back to interface{} using reflect.Type
  103. mapInterface := decoder.mapInterface
  104. mapInterface.word = ptr
  105. realInterface := (*interface{})(unsafe.Pointer(&mapInterface))
  106. realVal := reflect.ValueOf(*realInterface).Elem()
  107. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  108. elem := reflect.New(decoder.elemType)
  109. decoder.elemDecoder.decode(unsafe.Pointer(elem.Pointer()), iter)
  110. // to put into map, we have to use reflection
  111. realVal.SetMapIndex(reflect.ValueOf(string([]byte(field))), elem.Elem())
  112. }
  113. }
  114. // emptyInterface is the header for an interface{} value.
  115. type emptyInterface struct {
  116. typ *struct{}
  117. word unsafe.Pointer
  118. }
  119. // ReadAny converts a json object in a Iterator instance to Any
  120. func (iter *Iterator) ReadAny() (ret *Any) {
  121. valueType := iter.WhatIsNext()
  122. switch valueType {
  123. case String:
  124. return MakeAny(iter.ReadString())
  125. case Number:
  126. return iter.readNumber()
  127. case Null:
  128. return MakeAny(nil)
  129. case Bool:
  130. return MakeAny(iter.ReadBool())
  131. case Array:
  132. val := []interface{}{}
  133. for iter.ReadArray() {
  134. element := iter.ReadAny()
  135. if iter.Error != nil {
  136. return
  137. }
  138. val = append(val, element.val)
  139. }
  140. return MakeAny(val)
  141. case Object:
  142. val := map[string]interface{}{}
  143. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  144. element := iter.ReadAny()
  145. if iter.Error != nil {
  146. return
  147. }
  148. val[string([]byte(field))] = element.val
  149. }
  150. return MakeAny(val)
  151. default:
  152. iter.reportError("ReadAny", fmt.Sprintf("unexpected value type: %v", valueType))
  153. return MakeAny(nil)
  154. }
  155. }
  156. func (iter *Iterator) readNumber() (ret *Any) {
  157. strBuf := [8]byte{}
  158. str := strBuf[0:0]
  159. hasMore := true
  160. foundFloat := false
  161. foundNegative := false
  162. for hasMore {
  163. for i := iter.head; i < iter.tail; i++ {
  164. c := iter.buf[i]
  165. switch c {
  166. case '-':
  167. foundNegative = true
  168. str = append(str, c)
  169. continue
  170. case '+', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
  171. str = append(str, c)
  172. continue
  173. case '.', 'e', 'E':
  174. foundFloat = true
  175. str = append(str, c)
  176. continue
  177. default:
  178. iter.head = i
  179. hasMore = false
  180. break
  181. }
  182. if !hasMore {
  183. break
  184. }
  185. }
  186. if hasMore {
  187. if !iter.loadMore() {
  188. break
  189. }
  190. }
  191. }
  192. if iter.Error != nil && iter.Error != io.EOF {
  193. return
  194. }
  195. number := *(*string)(unsafe.Pointer(&str))
  196. if foundFloat {
  197. val, err := strconv.ParseFloat(number, 64)
  198. if err != nil {
  199. iter.Error = err
  200. return
  201. }
  202. return MakeAny(val)
  203. }
  204. if foundNegative {
  205. val, err := strconv.ParseInt(number, 10, 64)
  206. if err != nil {
  207. iter.Error = err
  208. return
  209. }
  210. return MakeAny(val)
  211. }
  212. val, err := strconv.ParseUint(number, 10, 64)
  213. if err != nil {
  214. iter.Error = err
  215. return
  216. }
  217. return MakeAny(val)
  218. }
  219. // Read converts an Iterator instance into go interface, same as json.Unmarshal
  220. func (iter *Iterator) Read(obj interface{}) {
  221. typ := reflect.TypeOf(obj)
  222. cacheKey := typ.Elem()
  223. cachedDecoder := getDecoderFromCache(cacheKey)
  224. if cachedDecoder == nil {
  225. decoder, err := decoderOfType(typ)
  226. if err != nil {
  227. iter.Error = err
  228. return
  229. }
  230. cachedDecoder = decoder
  231. addDecoderToCache(cacheKey, decoder)
  232. }
  233. e := (*emptyInterface)(unsafe.Pointer(&obj))
  234. cachedDecoder.decode(e.word, iter)
  235. }
  236. type prefix string
  237. func (p prefix) addTo(decoder Decoder, err error) (Decoder, error) {
  238. if err != nil {
  239. return nil, fmt.Errorf("%s: %s", p, err.Error())
  240. }
  241. return decoder, err
  242. }
  243. func decoderOfType(typ reflect.Type) (Decoder, error) {
  244. switch typ.Kind() {
  245. case reflect.Ptr:
  246. return prefix("ptr").addTo(decoderOfPtr(typ.Elem()))
  247. default:
  248. return nil, errors.New("expect ptr")
  249. }
  250. }
  251. func decoderOfPtr(typ reflect.Type) (Decoder, error) {
  252. typeName := typ.String()
  253. if typeName == "jsoniter.Any" {
  254. return &anyDecoder{}, nil
  255. }
  256. typeDecoder := typeDecoders[typeName]
  257. if typeDecoder != nil {
  258. return typeDecoder, nil
  259. }
  260. switch typ.Kind() {
  261. case reflect.String:
  262. return &stringDecoder{}, nil
  263. case reflect.Int:
  264. return &intDecoder{}, nil
  265. case reflect.Int8:
  266. return &int8Decoder{}, nil
  267. case reflect.Int16:
  268. return &int16Decoder{}, nil
  269. case reflect.Int32:
  270. return &int32Decoder{}, nil
  271. case reflect.Int64:
  272. return &int64Decoder{}, nil
  273. case reflect.Uint:
  274. return &uintDecoder{}, nil
  275. case reflect.Uint8:
  276. return &uint8Decoder{}, nil
  277. case reflect.Uint16:
  278. return &uint16Decoder{}, nil
  279. case reflect.Uint32:
  280. return &uint32Decoder{}, nil
  281. case reflect.Uint64:
  282. return &uint64Decoder{}, nil
  283. case reflect.Float32:
  284. return &float32Decoder{}, nil
  285. case reflect.Float64:
  286. return &float64Decoder{}, nil
  287. case reflect.Bool:
  288. return &boolDecoder{}, nil
  289. case reflect.Interface:
  290. return &interfaceDecoder{}, nil
  291. case reflect.Struct:
  292. return decoderOfStruct(typ)
  293. case reflect.Slice:
  294. return prefix("[slice]").addTo(decoderOfSlice(typ))
  295. case reflect.Map:
  296. return prefix("[map]").addTo(decoderOfMap(typ))
  297. case reflect.Ptr:
  298. return prefix("[optional]").addTo(decoderOfOptional(typ.Elem()))
  299. default:
  300. return nil, fmt.Errorf("unsupported type: %v", typ)
  301. }
  302. }
  303. func decoderOfOptional(typ reflect.Type) (Decoder, error) {
  304. decoder, err := decoderOfPtr(typ)
  305. if err != nil {
  306. return nil, err
  307. }
  308. return &optionalDecoder{typ, decoder}, nil
  309. }
  310. func decoderOfSlice(typ reflect.Type) (Decoder, error) {
  311. decoder, err := decoderOfPtr(typ.Elem())
  312. if err != nil {
  313. return nil, err
  314. }
  315. return &sliceDecoder{typ, typ.Elem(), decoder}, nil
  316. }
  317. func decoderOfMap(typ reflect.Type) (Decoder, error) {
  318. decoder, err := decoderOfPtr(typ.Elem())
  319. if err != nil {
  320. return nil, err
  321. }
  322. mapInterface := reflect.New(typ).Interface()
  323. return &mapDecoder{typ, typ.Elem(), decoder, *((*emptyInterface)(unsafe.Pointer(&mapInterface)))}, nil
  324. }