feature_reflect.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483
  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. func (decoder *funcDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  46. decoder.fun(ptr, iter)
  47. }
  48. type funcEncoder struct {
  49. fun EncoderFunc
  50. isEmptyFunc func(ptr unsafe.Pointer) bool
  51. }
  52. func (encoder *funcEncoder) encode(ptr unsafe.Pointer, stream *Stream) {
  53. encoder.fun(ptr, stream)
  54. }
  55. func (encoder *funcEncoder) encodeInterface(val interface{}, stream *Stream) {
  56. writeToStream(val, stream, encoder)
  57. }
  58. func (encoder *funcEncoder) isEmpty(ptr unsafe.Pointer) bool {
  59. if encoder.isEmptyFunc == nil {
  60. return false
  61. }
  62. return encoder.isEmptyFunc(ptr)
  63. }
  64. var jsonNumberType reflect.Type
  65. var jsonRawMessageType reflect.Type
  66. var jsoniterRawMessageType reflect.Type
  67. var anyType reflect.Type
  68. var marshalerType reflect.Type
  69. var unmarshalerType reflect.Type
  70. var textUnmarshalerType reflect.Type
  71. func init() {
  72. jsonNumberType = reflect.TypeOf((*json.Number)(nil)).Elem()
  73. jsonRawMessageType = reflect.TypeOf((*json.RawMessage)(nil)).Elem()
  74. jsoniterRawMessageType = reflect.TypeOf((*RawMessage)(nil)).Elem()
  75. anyType = reflect.TypeOf((*Any)(nil)).Elem()
  76. marshalerType = reflect.TypeOf((*json.Marshaler)(nil)).Elem()
  77. unmarshalerType = reflect.TypeOf((*json.Unmarshaler)(nil)).Elem()
  78. textUnmarshalerType = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem()
  79. }
  80. type optionalDecoder struct {
  81. valueType reflect.Type
  82. valueDecoder ValDecoder
  83. }
  84. func (decoder *optionalDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  85. if iter.ReadNil() {
  86. *((*unsafe.Pointer)(ptr)) = nil
  87. } else {
  88. if *((*unsafe.Pointer)(ptr)) == nil {
  89. // pointer to null, we have to allocate memory to hold the value
  90. value := reflect.New(decoder.valueType)
  91. decoder.valueDecoder.decode(unsafe.Pointer(value.Pointer()), iter)
  92. *((*uintptr)(ptr)) = value.Pointer()
  93. } else {
  94. // reuse existing instance
  95. decoder.valueDecoder.decode(*((*unsafe.Pointer)(ptr)), iter)
  96. }
  97. }
  98. }
  99. type optionalEncoder struct {
  100. valueEncoder ValEncoder
  101. }
  102. func (encoder *optionalEncoder) encode(ptr unsafe.Pointer, stream *Stream) {
  103. if *((*unsafe.Pointer)(ptr)) == nil {
  104. stream.WriteNil()
  105. } else {
  106. encoder.valueEncoder.encode(*((*unsafe.Pointer)(ptr)), stream)
  107. }
  108. }
  109. func (encoder *optionalEncoder) encodeInterface(val interface{}, stream *Stream) {
  110. writeToStream(val, stream, encoder)
  111. }
  112. func (encoder *optionalEncoder) isEmpty(ptr unsafe.Pointer) bool {
  113. if *((*unsafe.Pointer)(ptr)) == nil {
  114. return true
  115. } else {
  116. return encoder.valueEncoder.isEmpty(*((*unsafe.Pointer)(ptr)))
  117. }
  118. }
  119. type placeholderEncoder struct {
  120. cfg *frozenConfig
  121. cacheKey reflect.Type
  122. }
  123. func (encoder *placeholderEncoder) encode(ptr unsafe.Pointer, stream *Stream) {
  124. encoder.getRealEncoder().encode(ptr, stream)
  125. }
  126. func (encoder *placeholderEncoder) encodeInterface(val interface{}, stream *Stream) {
  127. writeToStream(val, stream, encoder)
  128. }
  129. func (encoder *placeholderEncoder) isEmpty(ptr unsafe.Pointer) bool {
  130. return encoder.getRealEncoder().isEmpty(ptr)
  131. }
  132. func (encoder *placeholderEncoder) getRealEncoder() ValEncoder {
  133. for i := 0; i < 30; i++ {
  134. realDecoder := encoder.cfg.getEncoderFromCache(encoder.cacheKey)
  135. _, isPlaceholder := realDecoder.(*placeholderEncoder)
  136. if isPlaceholder {
  137. time.Sleep(time.Second)
  138. } else {
  139. return realDecoder
  140. }
  141. }
  142. panic(fmt.Sprintf("real encoder not found for cache key: %v", encoder.cacheKey))
  143. }
  144. type placeholderDecoder struct {
  145. cfg *frozenConfig
  146. cacheKey reflect.Type
  147. }
  148. func (decoder *placeholderDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  149. for i := 0; i < 30; i++ {
  150. realDecoder := decoder.cfg.getDecoderFromCache(decoder.cacheKey)
  151. _, isPlaceholder := realDecoder.(*placeholderDecoder)
  152. if isPlaceholder {
  153. time.Sleep(time.Second)
  154. } else {
  155. realDecoder.decode(ptr, iter)
  156. return
  157. }
  158. }
  159. panic(fmt.Sprintf("real decoder not found for cache key: %v", decoder.cacheKey))
  160. }
  161. // emptyInterface is the header for an interface{} value.
  162. type emptyInterface struct {
  163. typ unsafe.Pointer
  164. word unsafe.Pointer
  165. }
  166. // emptyInterface is the header for an interface with method (not interface{})
  167. type nonEmptyInterface struct {
  168. // see ../runtime/iface.go:/Itab
  169. itab *struct {
  170. ityp unsafe.Pointer // static interface type
  171. typ unsafe.Pointer // dynamic concrete type
  172. link unsafe.Pointer
  173. bad int32
  174. unused int32
  175. fun [100000]unsafe.Pointer // method table
  176. }
  177. word unsafe.Pointer
  178. }
  179. // Read converts an Iterator instance into go interface, same as json.Unmarshal
  180. func (iter *Iterator) ReadVal(obj interface{}) {
  181. typ := reflect.TypeOf(obj)
  182. cacheKey := typ.Elem()
  183. decoder, err := decoderOfType(iter.cfg, cacheKey)
  184. if err != nil {
  185. iter.Error = err
  186. return
  187. }
  188. e := (*emptyInterface)(unsafe.Pointer(&obj))
  189. decoder.decode(e.word, iter)
  190. }
  191. func (stream *Stream) WriteVal(val interface{}) {
  192. if nil == val {
  193. stream.WriteNil()
  194. return
  195. }
  196. typ := reflect.TypeOf(val)
  197. cacheKey := typ
  198. encoder, err := encoderOfType(stream.cfg, cacheKey)
  199. if err != nil {
  200. stream.Error = err
  201. return
  202. }
  203. encoder.encodeInterface(val, stream)
  204. }
  205. type prefix string
  206. func (p prefix) addToDecoder(decoder ValDecoder, err error) (ValDecoder, error) {
  207. if err != nil {
  208. return nil, fmt.Errorf("%s: %s", p, err.Error())
  209. }
  210. return decoder, err
  211. }
  212. func (p prefix) addToEncoder(encoder ValEncoder, err error) (ValEncoder, error) {
  213. if err != nil {
  214. return nil, fmt.Errorf("%s: %s", p, err.Error())
  215. }
  216. return encoder, err
  217. }
  218. func decoderOfType(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) {
  219. cacheKey := typ
  220. decoder := cfg.getDecoderFromCache(cacheKey)
  221. if decoder != nil {
  222. return decoder, nil
  223. }
  224. decoder = getTypeDecoderFromExtension(typ)
  225. if decoder != nil {
  226. cfg.addDecoderToCache(cacheKey, decoder)
  227. return decoder, nil
  228. }
  229. decoder = &placeholderDecoder{cfg: cfg, cacheKey: cacheKey}
  230. cfg.addDecoderToCache(cacheKey, decoder)
  231. decoder, err := createDecoderOfType(cfg, typ)
  232. cfg.addDecoderToCache(cacheKey, decoder)
  233. return decoder, err
  234. }
  235. func createDecoderOfType(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) {
  236. if typ.String() == "[]uint8" {
  237. return &base64Codec{}, nil
  238. }
  239. if typ.AssignableTo(jsonRawMessageType) {
  240. return &jsonRawMessageCodec{}, nil
  241. }
  242. if typ.AssignableTo(jsoniterRawMessageType) {
  243. return &jsoniterRawMessageCodec{}, nil
  244. }
  245. if typ.AssignableTo(jsonNumberType) {
  246. return &jsonNumberCodec{}, nil
  247. }
  248. if typ.ConvertibleTo(unmarshalerType) {
  249. templateInterface := reflect.New(typ).Elem().Interface()
  250. var decoder ValDecoder = &unmarshalerDecoder{extractInterface(templateInterface)}
  251. if typ.Kind() != reflect.Struct {
  252. decoder = &optionalDecoder{typ, decoder}
  253. }
  254. return decoder, nil
  255. }
  256. if typ.ConvertibleTo(anyType) {
  257. return &anyCodec{}, nil
  258. }
  259. switch typ.Kind() {
  260. case reflect.String:
  261. return &stringCodec{}, nil
  262. case reflect.Int:
  263. return &intCodec{}, nil
  264. case reflect.Int8:
  265. return &int8Codec{}, nil
  266. case reflect.Int16:
  267. return &int16Codec{}, nil
  268. case reflect.Int32:
  269. return &int32Codec{}, nil
  270. case reflect.Int64:
  271. return &int64Codec{}, nil
  272. case reflect.Uint:
  273. return &uintCodec{}, nil
  274. case reflect.Uint8:
  275. return &uint8Codec{}, nil
  276. case reflect.Uint16:
  277. return &uint16Codec{}, nil
  278. case reflect.Uint32:
  279. return &uint32Codec{}, nil
  280. case reflect.Uint64:
  281. return &uint64Codec{}, nil
  282. case reflect.Float32:
  283. return &float32Codec{}, nil
  284. case reflect.Float64:
  285. return &float64Codec{}, nil
  286. case reflect.Bool:
  287. return &boolCodec{}, nil
  288. case reflect.Interface:
  289. if typ.NumMethod() == 0 {
  290. return &emptyInterfaceCodec{}, nil
  291. } else {
  292. return &nonEmptyInterfaceCodec{}, nil
  293. }
  294. case reflect.Struct:
  295. return prefix(fmt.Sprintf("[%s]", typ.String())).addToDecoder(decoderOfStruct(cfg, typ))
  296. case reflect.Array:
  297. return prefix("[array]").addToDecoder(decoderOfArray(cfg, typ))
  298. case reflect.Slice:
  299. return prefix("[slice]").addToDecoder(decoderOfSlice(cfg, typ))
  300. case reflect.Map:
  301. return prefix("[map]").addToDecoder(decoderOfMap(cfg, typ))
  302. case reflect.Ptr:
  303. return prefix("[optional]").addToDecoder(decoderOfOptional(cfg, typ))
  304. default:
  305. return nil, fmt.Errorf("unsupported type: %v", typ)
  306. }
  307. }
  308. func encoderOfType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  309. cacheKey := typ
  310. encoder := cfg.getEncoderFromCache(cacheKey)
  311. if encoder != nil {
  312. return encoder, nil
  313. }
  314. encoder = getTypeEncoderFromExtension(typ)
  315. if encoder != nil {
  316. cfg.addEncoderToCache(cacheKey, encoder)
  317. return encoder, nil
  318. }
  319. encoder = &placeholderEncoder{cfg: cfg, cacheKey: cacheKey}
  320. cfg.addEncoderToCache(cacheKey, encoder)
  321. encoder, err := createEncoderOfType(cfg, typ)
  322. cfg.addEncoderToCache(cacheKey, encoder)
  323. return encoder, err
  324. }
  325. func createEncoderOfType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  326. if typ.String() == "[]uint8" {
  327. return &base64Codec{}, nil
  328. }
  329. if typ.AssignableTo(jsonRawMessageType) {
  330. return &jsonRawMessageCodec{}, nil
  331. }
  332. if typ.AssignableTo(jsoniterRawMessageType) {
  333. return &jsoniterRawMessageCodec{}, nil
  334. }
  335. if typ.AssignableTo(jsonNumberType) {
  336. return &jsonNumberCodec{}, nil
  337. }
  338. if typ.ConvertibleTo(marshalerType) {
  339. templateInterface := reflect.New(typ).Elem().Interface()
  340. var encoder ValEncoder = &marshalerEncoder{extractInterface(templateInterface)}
  341. if typ.Kind() != reflect.Struct {
  342. encoder = &optionalEncoder{encoder}
  343. }
  344. return encoder, nil
  345. }
  346. if typ.ConvertibleTo(anyType) {
  347. return &anyCodec{}, nil
  348. }
  349. kind := typ.Kind()
  350. switch 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. if typ.NumMethod() == 0 {
  381. return &emptyInterfaceCodec{}, nil
  382. } else {
  383. return &nonEmptyInterfaceCodec{}, nil
  384. }
  385. case reflect.Struct:
  386. return prefix(fmt.Sprintf("[%s]", typ.String())).addToEncoder(encoderOfStruct(cfg, typ))
  387. case reflect.Array:
  388. return prefix("[array]").addToEncoder(encoderOfArray(cfg, typ))
  389. case reflect.Slice:
  390. return prefix("[slice]").addToEncoder(encoderOfSlice(cfg, typ))
  391. case reflect.Map:
  392. return prefix("[map]").addToEncoder(encoderOfMap(cfg, typ))
  393. case reflect.Ptr:
  394. return prefix("[optional]").addToEncoder(encoderOfOptional(cfg, typ))
  395. default:
  396. return nil, fmt.Errorf("unsupported type: %v", typ)
  397. }
  398. }
  399. func decoderOfOptional(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) {
  400. elemType := typ.Elem()
  401. decoder, err := decoderOfType(cfg, elemType)
  402. if err != nil {
  403. return nil, err
  404. }
  405. return &optionalDecoder{elemType, decoder}, nil
  406. }
  407. func encoderOfOptional(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  408. elemType := typ.Elem()
  409. elemEncoder, err := encoderOfType(cfg, elemType)
  410. if err != nil {
  411. return nil, err
  412. }
  413. encoder := &optionalEncoder{elemEncoder}
  414. if elemType.Kind() == reflect.Map {
  415. encoder = &optionalEncoder{encoder}
  416. }
  417. return encoder, nil
  418. }
  419. func decoderOfMap(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) {
  420. decoder, err := decoderOfType(cfg, typ.Elem())
  421. if err != nil {
  422. return nil, err
  423. }
  424. mapInterface := reflect.New(typ).Interface()
  425. return &mapDecoder{typ, typ.Key(), typ.Elem(), decoder, extractInterface(mapInterface)}, nil
  426. }
  427. func extractInterface(val interface{}) emptyInterface {
  428. return *((*emptyInterface)(unsafe.Pointer(&val)))
  429. }
  430. func encoderOfMap(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  431. elemType := typ.Elem()
  432. encoder, err := encoderOfType(cfg, elemType)
  433. if err != nil {
  434. return nil, err
  435. }
  436. mapInterface := reflect.New(typ).Elem().Interface()
  437. if cfg.sortMapKeys {
  438. return &sortKeysMapEncoder{typ, elemType, encoder, *((*emptyInterface)(unsafe.Pointer(&mapInterface)))}, nil
  439. } else {
  440. return &mapEncoder{typ, elemType, encoder, *((*emptyInterface)(unsafe.Pointer(&mapInterface)))}, nil
  441. }
  442. }