feature_reflect.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465
  1. package jsoniter
  2. import (
  3. "encoding"
  4. "encoding/json"
  5. "fmt"
  6. "reflect"
  7. "time"
  8. "unsafe"
  9. )
  10. // ValDecoder is an internal type registered to cache as needed.
  11. // Don't confuse jsoniter.ValDecoder with json.Decoder.
  12. // For json.Decoder's adapter, refer to jsoniter.AdapterDecoder(todo link).
  13. //
  14. // Reflection on type to create decoders, which is then cached
  15. // Reflection on value is avoided as we can, as the reflect.Value itself will allocate, with following exceptions
  16. // 1. create instance of new value, for example *int will need a int to be allocated
  17. // 2. append to slice, if the existing cap is not enough, allocate will be done using Reflect.New
  18. // 3. assignment to map, both key and value will be reflect.Value
  19. // For a simple struct binding, it will be reflect.Value free and allocation free
  20. type ValDecoder interface {
  21. Decode(ptr unsafe.Pointer, iter *Iterator)
  22. }
  23. // ValEncoder is an internal type registered to cache as needed.
  24. // Don't confuse jsoniter.ValEncoder with json.Encoder.
  25. // For json.Encoder's adapter, refer to jsoniter.AdapterEncoder(todo godoc link).
  26. type ValEncoder interface {
  27. IsEmpty(ptr unsafe.Pointer) bool
  28. Encode(ptr unsafe.Pointer, stream *Stream)
  29. EncodeInterface(val interface{}, stream *Stream)
  30. }
  31. func writeToStream(val interface{}, stream *Stream, encoder ValEncoder) {
  32. e := (*emptyInterface)(unsafe.Pointer(&val))
  33. if e.word == nil {
  34. stream.WriteNil()
  35. return
  36. }
  37. if reflect.TypeOf(val).Kind() == reflect.Ptr {
  38. encoder.Encode(unsafe.Pointer(&e.word), stream)
  39. } else {
  40. encoder.Encode(e.word, stream)
  41. }
  42. }
  43. type DecoderFunc func(ptr unsafe.Pointer, iter *Iterator)
  44. type EncoderFunc func(ptr unsafe.Pointer, stream *Stream)
  45. var jsonNumberType reflect.Type
  46. var jsonRawMessageType reflect.Type
  47. var jsoniterRawMessageType reflect.Type
  48. var anyType reflect.Type
  49. var marshalerType reflect.Type
  50. var unmarshalerType reflect.Type
  51. var textUnmarshalerType reflect.Type
  52. func init() {
  53. jsonNumberType = reflect.TypeOf((*json.Number)(nil)).Elem()
  54. jsonRawMessageType = reflect.TypeOf((*json.RawMessage)(nil)).Elem()
  55. jsoniterRawMessageType = reflect.TypeOf((*RawMessage)(nil)).Elem()
  56. anyType = reflect.TypeOf((*Any)(nil)).Elem()
  57. marshalerType = reflect.TypeOf((*json.Marshaler)(nil)).Elem()
  58. unmarshalerType = reflect.TypeOf((*json.Unmarshaler)(nil)).Elem()
  59. textUnmarshalerType = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem()
  60. }
  61. type optionalDecoder struct {
  62. valueType reflect.Type
  63. valueDecoder ValDecoder
  64. }
  65. func (decoder *optionalDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  66. if iter.ReadNil() {
  67. *((*unsafe.Pointer)(ptr)) = nil
  68. } else {
  69. if *((*unsafe.Pointer)(ptr)) == nil {
  70. // pointer to null, we have to allocate memory to hold the value
  71. value := reflect.New(decoder.valueType)
  72. decoder.valueDecoder.Decode(unsafe.Pointer(value.Pointer()), iter)
  73. *((*uintptr)(ptr)) = value.Pointer()
  74. } else {
  75. // reuse existing instance
  76. decoder.valueDecoder.Decode(*((*unsafe.Pointer)(ptr)), iter)
  77. }
  78. }
  79. }
  80. type optionalEncoder struct {
  81. valueEncoder ValEncoder
  82. }
  83. func (encoder *optionalEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
  84. if *((*unsafe.Pointer)(ptr)) == nil {
  85. stream.WriteNil()
  86. } else {
  87. encoder.valueEncoder.Encode(*((*unsafe.Pointer)(ptr)), stream)
  88. }
  89. }
  90. func (encoder *optionalEncoder) EncodeInterface(val interface{}, stream *Stream) {
  91. writeToStream(val, stream, encoder)
  92. }
  93. func (encoder *optionalEncoder) IsEmpty(ptr unsafe.Pointer) bool {
  94. if *((*unsafe.Pointer)(ptr)) == nil {
  95. return true
  96. } else {
  97. return encoder.valueEncoder.IsEmpty(*((*unsafe.Pointer)(ptr)))
  98. }
  99. }
  100. type placeholderEncoder struct {
  101. cfg *frozenConfig
  102. cacheKey reflect.Type
  103. }
  104. func (encoder *placeholderEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
  105. encoder.getRealEncoder().Encode(ptr, stream)
  106. }
  107. func (encoder *placeholderEncoder) EncodeInterface(val interface{}, stream *Stream) {
  108. writeToStream(val, stream, encoder)
  109. }
  110. func (encoder *placeholderEncoder) IsEmpty(ptr unsafe.Pointer) bool {
  111. return encoder.getRealEncoder().IsEmpty(ptr)
  112. }
  113. func (encoder *placeholderEncoder) getRealEncoder() ValEncoder {
  114. for i := 0; i < 30; i++ {
  115. realDecoder := encoder.cfg.getEncoderFromCache(encoder.cacheKey)
  116. _, isPlaceholder := realDecoder.(*placeholderEncoder)
  117. if isPlaceholder {
  118. time.Sleep(time.Second)
  119. } else {
  120. return realDecoder
  121. }
  122. }
  123. panic(fmt.Sprintf("real encoder not found for cache key: %v", encoder.cacheKey))
  124. }
  125. type placeholderDecoder struct {
  126. cfg *frozenConfig
  127. cacheKey reflect.Type
  128. }
  129. func (decoder *placeholderDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  130. for i := 0; i < 30; i++ {
  131. realDecoder := decoder.cfg.getDecoderFromCache(decoder.cacheKey)
  132. _, isPlaceholder := realDecoder.(*placeholderDecoder)
  133. if isPlaceholder {
  134. time.Sleep(time.Second)
  135. } else {
  136. realDecoder.Decode(ptr, iter)
  137. return
  138. }
  139. }
  140. panic(fmt.Sprintf("real decoder not found for cache key: %v", decoder.cacheKey))
  141. }
  142. // emptyInterface is the header for an interface{} value.
  143. type emptyInterface struct {
  144. typ unsafe.Pointer
  145. word unsafe.Pointer
  146. }
  147. // emptyInterface is the header for an interface with method (not interface{})
  148. type nonEmptyInterface struct {
  149. // see ../runtime/iface.go:/Itab
  150. itab *struct {
  151. ityp unsafe.Pointer // static interface type
  152. typ unsafe.Pointer // dynamic concrete type
  153. link unsafe.Pointer
  154. bad int32
  155. unused int32
  156. fun [100000]unsafe.Pointer // method table
  157. }
  158. word unsafe.Pointer
  159. }
  160. // Read converts an Iterator instance into go interface, same as json.Unmarshal
  161. func (iter *Iterator) ReadVal(obj interface{}) {
  162. typ := reflect.TypeOf(obj)
  163. cacheKey := typ.Elem()
  164. decoder, err := decoderOfType(iter.cfg, cacheKey)
  165. if err != nil {
  166. iter.Error = err
  167. return
  168. }
  169. e := (*emptyInterface)(unsafe.Pointer(&obj))
  170. decoder.Decode(e.word, iter)
  171. }
  172. func (stream *Stream) WriteVal(val interface{}) {
  173. if nil == val {
  174. stream.WriteNil()
  175. return
  176. }
  177. typ := reflect.TypeOf(val)
  178. cacheKey := typ
  179. encoder, err := encoderOfType(stream.cfg, cacheKey)
  180. if err != nil {
  181. stream.Error = err
  182. return
  183. }
  184. encoder.EncodeInterface(val, stream)
  185. }
  186. type prefix string
  187. func (p prefix) addToDecoder(decoder ValDecoder, err error) (ValDecoder, error) {
  188. if err != nil {
  189. return nil, fmt.Errorf("%s: %s", p, err.Error())
  190. }
  191. return decoder, err
  192. }
  193. func (p prefix) addToEncoder(encoder ValEncoder, err error) (ValEncoder, error) {
  194. if err != nil {
  195. return nil, fmt.Errorf("%s: %s", p, err.Error())
  196. }
  197. return encoder, err
  198. }
  199. func decoderOfType(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) {
  200. cacheKey := typ
  201. decoder := cfg.getDecoderFromCache(cacheKey)
  202. if decoder != nil {
  203. return decoder, nil
  204. }
  205. decoder = getTypeDecoderFromExtension(typ)
  206. if decoder != nil {
  207. cfg.addDecoderToCache(cacheKey, decoder)
  208. return decoder, nil
  209. }
  210. decoder = &placeholderDecoder{cfg: cfg, cacheKey: cacheKey}
  211. cfg.addDecoderToCache(cacheKey, decoder)
  212. decoder, err := createDecoderOfType(cfg, typ)
  213. for _, extension := range extensions {
  214. decoder = extension.DecorateDecoder(typ, decoder)
  215. }
  216. cfg.addDecoderToCache(cacheKey, decoder)
  217. return decoder, err
  218. }
  219. func createDecoderOfType(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) {
  220. if typ.String() == "[]uint8" {
  221. return &base64Codec{}, nil
  222. }
  223. if typ.AssignableTo(jsonRawMessageType) {
  224. return &jsonRawMessageCodec{}, nil
  225. }
  226. if typ.AssignableTo(jsoniterRawMessageType) {
  227. return &jsoniterRawMessageCodec{}, nil
  228. }
  229. if typ.AssignableTo(jsonNumberType) {
  230. return &jsonNumberCodec{}, nil
  231. }
  232. if typ.ConvertibleTo(unmarshalerType) {
  233. templateInterface := reflect.New(typ).Elem().Interface()
  234. var decoder ValDecoder = &unmarshalerDecoder{extractInterface(templateInterface)}
  235. if typ.Kind() != reflect.Struct {
  236. decoder = &optionalDecoder{typ, decoder}
  237. }
  238. return decoder, nil
  239. }
  240. if typ.ConvertibleTo(anyType) {
  241. return &anyCodec{}, nil
  242. }
  243. switch typ.Kind() {
  244. case reflect.String:
  245. return &stringCodec{}, nil
  246. case reflect.Int:
  247. return &intCodec{}, nil
  248. case reflect.Int8:
  249. return &int8Codec{}, nil
  250. case reflect.Int16:
  251. return &int16Codec{}, nil
  252. case reflect.Int32:
  253. return &int32Codec{}, nil
  254. case reflect.Int64:
  255. return &int64Codec{}, nil
  256. case reflect.Uint:
  257. return &uintCodec{}, nil
  258. case reflect.Uint8:
  259. return &uint8Codec{}, nil
  260. case reflect.Uint16:
  261. return &uint16Codec{}, nil
  262. case reflect.Uint32:
  263. return &uint32Codec{}, nil
  264. case reflect.Uint64:
  265. return &uint64Codec{}, nil
  266. case reflect.Float32:
  267. return &float32Codec{}, nil
  268. case reflect.Float64:
  269. return &float64Codec{}, nil
  270. case reflect.Bool:
  271. return &boolCodec{}, nil
  272. case reflect.Interface:
  273. if typ.NumMethod() == 0 {
  274. return &emptyInterfaceCodec{}, nil
  275. } else {
  276. return &nonEmptyInterfaceCodec{}, nil
  277. }
  278. case reflect.Struct:
  279. return prefix(fmt.Sprintf("[%s]", typ.String())).addToDecoder(decoderOfStruct(cfg, typ))
  280. case reflect.Array:
  281. return prefix("[array]").addToDecoder(decoderOfArray(cfg, typ))
  282. case reflect.Slice:
  283. return prefix("[slice]").addToDecoder(decoderOfSlice(cfg, typ))
  284. case reflect.Map:
  285. return prefix("[map]").addToDecoder(decoderOfMap(cfg, typ))
  286. case reflect.Ptr:
  287. return prefix("[optional]").addToDecoder(decoderOfOptional(cfg, typ))
  288. default:
  289. return nil, fmt.Errorf("unsupported type: %v", typ)
  290. }
  291. }
  292. func encoderOfType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  293. cacheKey := typ
  294. encoder := cfg.getEncoderFromCache(cacheKey)
  295. if encoder != nil {
  296. return encoder, nil
  297. }
  298. encoder = getTypeEncoderFromExtension(typ)
  299. if encoder != nil {
  300. cfg.addEncoderToCache(cacheKey, encoder)
  301. return encoder, nil
  302. }
  303. encoder = &placeholderEncoder{cfg: cfg, cacheKey: cacheKey}
  304. cfg.addEncoderToCache(cacheKey, encoder)
  305. encoder, err := createEncoderOfType(cfg, typ)
  306. for _, extension := range extensions {
  307. encoder = extension.DecorateEncoder(typ, encoder)
  308. }
  309. cfg.addEncoderToCache(cacheKey, encoder)
  310. return encoder, err
  311. }
  312. func createEncoderOfType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  313. if typ.String() == "[]uint8" {
  314. return &base64Codec{}, nil
  315. }
  316. if typ.AssignableTo(jsonRawMessageType) {
  317. return &jsonRawMessageCodec{}, nil
  318. }
  319. if typ.AssignableTo(jsoniterRawMessageType) {
  320. return &jsoniterRawMessageCodec{}, nil
  321. }
  322. if typ.AssignableTo(jsonNumberType) {
  323. return &jsonNumberCodec{}, nil
  324. }
  325. if typ.ConvertibleTo(marshalerType) {
  326. templateInterface := reflect.New(typ).Elem().Interface()
  327. var encoder ValEncoder = &marshalerEncoder{extractInterface(templateInterface)}
  328. if typ.Kind() != reflect.Struct {
  329. encoder = &optionalEncoder{encoder}
  330. }
  331. return encoder, nil
  332. }
  333. if typ.ConvertibleTo(anyType) {
  334. return &anyCodec{}, nil
  335. }
  336. kind := typ.Kind()
  337. switch kind {
  338. case reflect.String:
  339. return &stringCodec{}, nil
  340. case reflect.Int:
  341. return &intCodec{}, nil
  342. case reflect.Int8:
  343. return &int8Codec{}, nil
  344. case reflect.Int16:
  345. return &int16Codec{}, nil
  346. case reflect.Int32:
  347. return &int32Codec{}, nil
  348. case reflect.Int64:
  349. return &int64Codec{}, nil
  350. case reflect.Uint:
  351. return &uintCodec{}, nil
  352. case reflect.Uint8:
  353. return &uint8Codec{}, nil
  354. case reflect.Uint16:
  355. return &uint16Codec{}, nil
  356. case reflect.Uint32:
  357. return &uint32Codec{}, nil
  358. case reflect.Uint64:
  359. return &uint64Codec{}, nil
  360. case reflect.Float32:
  361. return &float32Codec{}, nil
  362. case reflect.Float64:
  363. return &float64Codec{}, nil
  364. case reflect.Bool:
  365. return &boolCodec{}, nil
  366. case reflect.Interface:
  367. if typ.NumMethod() == 0 {
  368. return &emptyInterfaceCodec{}, nil
  369. } else {
  370. return &nonEmptyInterfaceCodec{}, nil
  371. }
  372. case reflect.Struct:
  373. return prefix(fmt.Sprintf("[%s]", typ.String())).addToEncoder(encoderOfStruct(cfg, typ))
  374. case reflect.Array:
  375. return prefix("[array]").addToEncoder(encoderOfArray(cfg, typ))
  376. case reflect.Slice:
  377. return prefix("[slice]").addToEncoder(encoderOfSlice(cfg, typ))
  378. case reflect.Map:
  379. return prefix("[map]").addToEncoder(encoderOfMap(cfg, typ))
  380. case reflect.Ptr:
  381. return prefix("[optional]").addToEncoder(encoderOfOptional(cfg, typ))
  382. default:
  383. return nil, fmt.Errorf("unsupported type: %v", typ)
  384. }
  385. }
  386. func decoderOfOptional(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) {
  387. elemType := typ.Elem()
  388. decoder, err := decoderOfType(cfg, elemType)
  389. if err != nil {
  390. return nil, err
  391. }
  392. return &optionalDecoder{elemType, decoder}, nil
  393. }
  394. func encoderOfOptional(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  395. elemType := typ.Elem()
  396. elemEncoder, err := encoderOfType(cfg, elemType)
  397. if err != nil {
  398. return nil, err
  399. }
  400. encoder := &optionalEncoder{elemEncoder}
  401. if elemType.Kind() == reflect.Map {
  402. encoder = &optionalEncoder{encoder}
  403. }
  404. return encoder, nil
  405. }
  406. func decoderOfMap(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) {
  407. decoder, err := decoderOfType(cfg, typ.Elem())
  408. if err != nil {
  409. return nil, err
  410. }
  411. mapInterface := reflect.New(typ).Interface()
  412. return &mapDecoder{typ, typ.Key(), typ.Elem(), decoder, extractInterface(mapInterface)}, nil
  413. }
  414. func extractInterface(val interface{}) emptyInterface {
  415. return *((*emptyInterface)(unsafe.Pointer(&val)))
  416. }
  417. func encoderOfMap(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  418. elemType := typ.Elem()
  419. encoder, err := encoderOfType(cfg, elemType)
  420. if err != nil {
  421. return nil, err
  422. }
  423. mapInterface := reflect.New(typ).Elem().Interface()
  424. if cfg.sortMapKeys {
  425. return &sortKeysMapEncoder{typ, elemType, encoder, *((*emptyInterface)(unsafe.Pointer(&mapInterface)))}, nil
  426. } else {
  427. return &mapEncoder{typ, elemType, encoder, *((*emptyInterface)(unsafe.Pointer(&mapInterface)))}, nil
  428. }
  429. }