feature_reflect.go 12 KB

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