feature_reflect.go 16 KB

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