feature_reflect.go 13 KB

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