feature_reflect.go 11 KB

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