feature_reflect.go 13 KB

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