feature_reflect.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459
  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. cfg.addDecoderToCache(cacheKey, decoder)
  214. return decoder, err
  215. }
  216. func createDecoderOfType(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) {
  217. if typ.String() == "[]uint8" {
  218. return &base64Codec{}, nil
  219. }
  220. if typ.AssignableTo(jsonRawMessageType) {
  221. return &jsonRawMessageCodec{}, nil
  222. }
  223. if typ.AssignableTo(jsoniterRawMessageType) {
  224. return &jsoniterRawMessageCodec{}, nil
  225. }
  226. if typ.AssignableTo(jsonNumberType) {
  227. return &jsonNumberCodec{}, nil
  228. }
  229. if typ.ConvertibleTo(unmarshalerType) {
  230. templateInterface := reflect.New(typ).Elem().Interface()
  231. var decoder ValDecoder = &unmarshalerDecoder{extractInterface(templateInterface)}
  232. if typ.Kind() != reflect.Struct {
  233. decoder = &optionalDecoder{typ, decoder}
  234. }
  235. return decoder, nil
  236. }
  237. if typ.ConvertibleTo(anyType) {
  238. return &anyCodec{}, nil
  239. }
  240. switch typ.Kind() {
  241. case reflect.String:
  242. return &stringCodec{}, nil
  243. case reflect.Int:
  244. return &intCodec{}, nil
  245. case reflect.Int8:
  246. return &int8Codec{}, nil
  247. case reflect.Int16:
  248. return &int16Codec{}, nil
  249. case reflect.Int32:
  250. return &int32Codec{}, nil
  251. case reflect.Int64:
  252. return &int64Codec{}, nil
  253. case reflect.Uint:
  254. return &uintCodec{}, nil
  255. case reflect.Uint8:
  256. return &uint8Codec{}, nil
  257. case reflect.Uint16:
  258. return &uint16Codec{}, nil
  259. case reflect.Uint32:
  260. return &uint32Codec{}, nil
  261. case reflect.Uint64:
  262. return &uint64Codec{}, nil
  263. case reflect.Float32:
  264. return &float32Codec{}, nil
  265. case reflect.Float64:
  266. return &float64Codec{}, nil
  267. case reflect.Bool:
  268. return &boolCodec{}, nil
  269. case reflect.Interface:
  270. if typ.NumMethod() == 0 {
  271. return &emptyInterfaceCodec{}, nil
  272. } else {
  273. return &nonEmptyInterfaceCodec{}, nil
  274. }
  275. case reflect.Struct:
  276. return prefix(fmt.Sprintf("[%s]", typ.String())).addToDecoder(decoderOfStruct(cfg, typ))
  277. case reflect.Array:
  278. return prefix("[array]").addToDecoder(decoderOfArray(cfg, typ))
  279. case reflect.Slice:
  280. return prefix("[slice]").addToDecoder(decoderOfSlice(cfg, typ))
  281. case reflect.Map:
  282. return prefix("[map]").addToDecoder(decoderOfMap(cfg, typ))
  283. case reflect.Ptr:
  284. return prefix("[optional]").addToDecoder(decoderOfOptional(cfg, typ))
  285. default:
  286. return nil, fmt.Errorf("unsupported type: %v", typ)
  287. }
  288. }
  289. func encoderOfType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  290. cacheKey := typ
  291. encoder := cfg.getEncoderFromCache(cacheKey)
  292. if encoder != nil {
  293. return encoder, nil
  294. }
  295. encoder = getTypeEncoderFromExtension(typ)
  296. if encoder != nil {
  297. cfg.addEncoderToCache(cacheKey, encoder)
  298. return encoder, nil
  299. }
  300. encoder = &placeholderEncoder{cfg: cfg, cacheKey: cacheKey}
  301. cfg.addEncoderToCache(cacheKey, encoder)
  302. encoder, err := createEncoderOfType(cfg, typ)
  303. cfg.addEncoderToCache(cacheKey, encoder)
  304. return encoder, err
  305. }
  306. func createEncoderOfType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  307. if typ.String() == "[]uint8" {
  308. return &base64Codec{}, nil
  309. }
  310. if typ.AssignableTo(jsonRawMessageType) {
  311. return &jsonRawMessageCodec{}, nil
  312. }
  313. if typ.AssignableTo(jsoniterRawMessageType) {
  314. return &jsoniterRawMessageCodec{}, nil
  315. }
  316. if typ.AssignableTo(jsonNumberType) {
  317. return &jsonNumberCodec{}, nil
  318. }
  319. if typ.ConvertibleTo(marshalerType) {
  320. templateInterface := reflect.New(typ).Elem().Interface()
  321. var encoder ValEncoder = &marshalerEncoder{extractInterface(templateInterface)}
  322. if typ.Kind() != reflect.Struct {
  323. encoder = &optionalEncoder{encoder}
  324. }
  325. return encoder, nil
  326. }
  327. if typ.ConvertibleTo(anyType) {
  328. return &anyCodec{}, nil
  329. }
  330. kind := typ.Kind()
  331. switch kind {
  332. case reflect.String:
  333. return &stringCodec{}, nil
  334. case reflect.Int:
  335. return &intCodec{}, nil
  336. case reflect.Int8:
  337. return &int8Codec{}, nil
  338. case reflect.Int16:
  339. return &int16Codec{}, nil
  340. case reflect.Int32:
  341. return &int32Codec{}, nil
  342. case reflect.Int64:
  343. return &int64Codec{}, nil
  344. case reflect.Uint:
  345. return &uintCodec{}, nil
  346. case reflect.Uint8:
  347. return &uint8Codec{}, nil
  348. case reflect.Uint16:
  349. return &uint16Codec{}, nil
  350. case reflect.Uint32:
  351. return &uint32Codec{}, nil
  352. case reflect.Uint64:
  353. return &uint64Codec{}, nil
  354. case reflect.Float32:
  355. return &float32Codec{}, nil
  356. case reflect.Float64:
  357. return &float64Codec{}, nil
  358. case reflect.Bool:
  359. return &boolCodec{}, nil
  360. case reflect.Interface:
  361. if typ.NumMethod() == 0 {
  362. return &emptyInterfaceCodec{}, nil
  363. } else {
  364. return &nonEmptyInterfaceCodec{}, nil
  365. }
  366. case reflect.Struct:
  367. return prefix(fmt.Sprintf("[%s]", typ.String())).addToEncoder(encoderOfStruct(cfg, typ))
  368. case reflect.Array:
  369. return prefix("[array]").addToEncoder(encoderOfArray(cfg, typ))
  370. case reflect.Slice:
  371. return prefix("[slice]").addToEncoder(encoderOfSlice(cfg, typ))
  372. case reflect.Map:
  373. return prefix("[map]").addToEncoder(encoderOfMap(cfg, typ))
  374. case reflect.Ptr:
  375. return prefix("[optional]").addToEncoder(encoderOfOptional(cfg, typ))
  376. default:
  377. return nil, fmt.Errorf("unsupported type: %v", typ)
  378. }
  379. }
  380. func decoderOfOptional(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) {
  381. elemType := typ.Elem()
  382. decoder, err := decoderOfType(cfg, elemType)
  383. if err != nil {
  384. return nil, err
  385. }
  386. return &optionalDecoder{elemType, decoder}, nil
  387. }
  388. func encoderOfOptional(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  389. elemType := typ.Elem()
  390. elemEncoder, err := encoderOfType(cfg, elemType)
  391. if err != nil {
  392. return nil, err
  393. }
  394. encoder := &optionalEncoder{elemEncoder}
  395. if elemType.Kind() == reflect.Map {
  396. encoder = &optionalEncoder{encoder}
  397. }
  398. return encoder, nil
  399. }
  400. func decoderOfMap(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) {
  401. decoder, err := decoderOfType(cfg, typ.Elem())
  402. if err != nil {
  403. return nil, err
  404. }
  405. mapInterface := reflect.New(typ).Interface()
  406. return &mapDecoder{typ, typ.Key(), typ.Elem(), decoder, extractInterface(mapInterface)}, nil
  407. }
  408. func extractInterface(val interface{}) emptyInterface {
  409. return *((*emptyInterface)(unsafe.Pointer(&val)))
  410. }
  411. func encoderOfMap(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  412. elemType := typ.Elem()
  413. encoder, err := encoderOfType(cfg, elemType)
  414. if err != nil {
  415. return nil, err
  416. }
  417. mapInterface := reflect.New(typ).Elem().Interface()
  418. if cfg.sortMapKeys {
  419. return &sortKeysMapEncoder{typ, elemType, encoder, *((*emptyInterface)(unsafe.Pointer(&mapInterface)))}, nil
  420. } else {
  421. return &mapEncoder{typ, elemType, encoder, *((*emptyInterface)(unsafe.Pointer(&mapInterface)))}, nil
  422. }
  423. }