feature_reflect.go 14 KB

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