feature_reflect.go 12 KB

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