feature_reflect.go 15 KB

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