feature_reflect.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551
  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. typeName := typ.String()
  221. if typ == jsonRawMessageType {
  222. return &jsonRawMessageCodec{}, nil
  223. }
  224. if typ == jsoniterRawMessageType {
  225. return &jsoniterRawMessageCodec{}, nil
  226. }
  227. if typ.AssignableTo(jsonNumberType) {
  228. return &jsonNumberCodec{}, nil
  229. }
  230. if typ.Kind() == reflect.Slice && typ.Elem().Kind() == reflect.Uint8 {
  231. return &base64Codec{}, nil
  232. }
  233. if typ.ConvertibleTo(unmarshalerType) {
  234. templateInterface := reflect.New(typ).Elem().Interface()
  235. var decoder ValDecoder = &unmarshalerDecoder{extractInterface(templateInterface)}
  236. if typ.Kind() != reflect.Struct {
  237. decoder = &optionalDecoder{typ, decoder}
  238. }
  239. return decoder, nil
  240. }
  241. if typ.ConvertibleTo(anyType) {
  242. return &anyCodec{}, nil
  243. }
  244. switch typ.Kind() {
  245. case reflect.String:
  246. if typeName != "string" {
  247. return decoderOfType(cfg, reflect.TypeOf((*string)(nil)).Elem())
  248. }
  249. return &stringCodec{}, nil
  250. case reflect.Int:
  251. if typeName != "int" {
  252. return decoderOfType(cfg, reflect.TypeOf((*int)(nil)).Elem())
  253. }
  254. return &intCodec{}, nil
  255. case reflect.Int8:
  256. if typeName != "int8" {
  257. return decoderOfType(cfg, reflect.TypeOf((*int8)(nil)).Elem())
  258. }
  259. return &int8Codec{}, nil
  260. case reflect.Int16:
  261. if typeName != "int16" {
  262. return decoderOfType(cfg, reflect.TypeOf((*int16)(nil)).Elem())
  263. }
  264. return &int16Codec{}, nil
  265. case reflect.Int32:
  266. if typeName != "int32" {
  267. return decoderOfType(cfg, reflect.TypeOf((*int32)(nil)).Elem())
  268. }
  269. return &int32Codec{}, nil
  270. case reflect.Int64:
  271. if typeName != "int64" {
  272. return decoderOfType(cfg, reflect.TypeOf((*int64)(nil)).Elem())
  273. }
  274. return &int64Codec{}, nil
  275. case reflect.Uint:
  276. if typeName != "uint" {
  277. return decoderOfType(cfg, reflect.TypeOf((*uint)(nil)).Elem())
  278. }
  279. return &uintCodec{}, nil
  280. case reflect.Uint8:
  281. if typeName != "uint8" {
  282. return decoderOfType(cfg, reflect.TypeOf((*uint8)(nil)).Elem())
  283. }
  284. return &uint8Codec{}, nil
  285. case reflect.Uint16:
  286. if typeName != "uint16" {
  287. return decoderOfType(cfg, reflect.TypeOf((*uint16)(nil)).Elem())
  288. }
  289. return &uint16Codec{}, nil
  290. case reflect.Uint32:
  291. if typeName != "uint32" {
  292. return decoderOfType(cfg, reflect.TypeOf((*uint32)(nil)).Elem())
  293. }
  294. return &uint32Codec{}, nil
  295. case reflect.Uint64:
  296. if typeName != "uint64" {
  297. return decoderOfType(cfg, reflect.TypeOf((*uint64)(nil)).Elem())
  298. }
  299. return &uint64Codec{}, nil
  300. case reflect.Float32:
  301. if typeName != "float32" {
  302. return decoderOfType(cfg, reflect.TypeOf((*float32)(nil)).Elem())
  303. }
  304. return &float32Codec{}, nil
  305. case reflect.Float64:
  306. if typeName != "float64" {
  307. return decoderOfType(cfg, reflect.TypeOf((*float64)(nil)).Elem())
  308. }
  309. return &float64Codec{}, nil
  310. case reflect.Bool:
  311. if typeName != "bool" {
  312. return decoderOfType(cfg, reflect.TypeOf((*bool)(nil)).Elem())
  313. }
  314. return &boolCodec{}, nil
  315. case reflect.Interface:
  316. if typ.NumMethod() == 0 {
  317. return &emptyInterfaceCodec{}, nil
  318. } else {
  319. return &nonEmptyInterfaceCodec{}, nil
  320. }
  321. case reflect.Struct:
  322. return prefix(fmt.Sprintf("[%s]", typeName)).addToDecoder(decoderOfStruct(cfg, typ))
  323. case reflect.Array:
  324. return prefix("[array]").addToDecoder(decoderOfArray(cfg, typ))
  325. case reflect.Slice:
  326. return prefix("[slice]").addToDecoder(decoderOfSlice(cfg, typ))
  327. case reflect.Map:
  328. return prefix("[map]").addToDecoder(decoderOfMap(cfg, typ))
  329. case reflect.Ptr:
  330. return prefix("[optional]").addToDecoder(decoderOfOptional(cfg, typ))
  331. default:
  332. return nil, fmt.Errorf("unsupported type: %v", typ)
  333. }
  334. }
  335. func encoderOfType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  336. cacheKey := typ
  337. encoder := cfg.getEncoderFromCache(cacheKey)
  338. if encoder != nil {
  339. return encoder, nil
  340. }
  341. encoder = getTypeEncoderFromExtension(typ)
  342. if encoder != nil {
  343. cfg.addEncoderToCache(cacheKey, encoder)
  344. return encoder, nil
  345. }
  346. encoder = &placeholderEncoder{cfg: cfg, cacheKey: cacheKey}
  347. cfg.addEncoderToCache(cacheKey, encoder)
  348. encoder, err := createEncoderOfType(cfg, typ)
  349. for _, extension := range extensions {
  350. encoder = extension.DecorateEncoder(typ, encoder)
  351. }
  352. cfg.addEncoderToCache(cacheKey, encoder)
  353. return encoder, err
  354. }
  355. func createEncoderOfType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  356. typeName := typ.String()
  357. if typ == jsonRawMessageType {
  358. return &jsonRawMessageCodec{}, nil
  359. }
  360. if typ == jsoniterRawMessageType {
  361. return &jsoniterRawMessageCodec{}, nil
  362. }
  363. if typ.AssignableTo(jsonNumberType) {
  364. return &jsonNumberCodec{}, nil
  365. }
  366. if typ.Kind() == reflect.Slice && typ.Elem().Kind() == reflect.Uint8 {
  367. return &base64Codec{typ}, nil
  368. }
  369. if typ.ConvertibleTo(marshalerType) {
  370. templateInterface := reflect.New(typ).Elem().Interface()
  371. var encoder ValEncoder = &marshalerEncoder{extractInterface(templateInterface)}
  372. if typ.Kind() != reflect.Struct {
  373. encoder = &optionalEncoder{encoder}
  374. }
  375. return encoder, nil
  376. }
  377. if typ.ConvertibleTo(anyType) {
  378. return &anyCodec{}, nil
  379. }
  380. kind := typ.Kind()
  381. switch kind {
  382. case reflect.String:
  383. if typeName != "string" {
  384. return encoderOfType(cfg, reflect.TypeOf((*string)(nil)).Elem())
  385. }
  386. return &stringCodec{}, nil
  387. case reflect.Int:
  388. if typeName != "int" {
  389. return encoderOfType(cfg, reflect.TypeOf((*int)(nil)).Elem())
  390. }
  391. return &intCodec{}, nil
  392. case reflect.Int8:
  393. if typeName != "int8" {
  394. return encoderOfType(cfg, reflect.TypeOf((*int8)(nil)).Elem())
  395. }
  396. return &int8Codec{}, nil
  397. case reflect.Int16:
  398. if typeName != "int16" {
  399. return encoderOfType(cfg, reflect.TypeOf((*int16)(nil)).Elem())
  400. }
  401. return &int16Codec{}, nil
  402. case reflect.Int32:
  403. if typeName != "int32" {
  404. return encoderOfType(cfg, reflect.TypeOf((*int32)(nil)).Elem())
  405. }
  406. return &int32Codec{}, nil
  407. case reflect.Int64:
  408. if typeName != "int64" {
  409. return encoderOfType(cfg, reflect.TypeOf((*int64)(nil)).Elem())
  410. }
  411. return &int64Codec{}, nil
  412. case reflect.Uint:
  413. if typeName != "uint" {
  414. return encoderOfType(cfg, reflect.TypeOf((*uint)(nil)).Elem())
  415. }
  416. return &uintCodec{}, nil
  417. case reflect.Uint8:
  418. if typeName != "uint8" {
  419. return encoderOfType(cfg, reflect.TypeOf((*uint8)(nil)).Elem())
  420. }
  421. return &uint8Codec{}, nil
  422. case reflect.Uint16:
  423. if typeName != "uint16" {
  424. return encoderOfType(cfg, reflect.TypeOf((*uint16)(nil)).Elem())
  425. }
  426. return &uint16Codec{}, nil
  427. case reflect.Uint32:
  428. if typeName != "uint32" {
  429. return encoderOfType(cfg, reflect.TypeOf((*uint32)(nil)).Elem())
  430. }
  431. return &uint32Codec{}, nil
  432. case reflect.Uint64:
  433. if typeName != "uint64" {
  434. return encoderOfType(cfg, reflect.TypeOf((*uint64)(nil)).Elem())
  435. }
  436. return &uint64Codec{}, nil
  437. case reflect.Float32:
  438. if typeName != "float32" {
  439. return encoderOfType(cfg, reflect.TypeOf((*float32)(nil)).Elem())
  440. }
  441. return &float32Codec{}, nil
  442. case reflect.Float64:
  443. if typeName != "float64" {
  444. return encoderOfType(cfg, reflect.TypeOf((*float64)(nil)).Elem())
  445. }
  446. return &float64Codec{}, nil
  447. case reflect.Bool:
  448. if typeName != "bool" {
  449. return encoderOfType(cfg, reflect.TypeOf((*bool)(nil)).Elem())
  450. }
  451. return &boolCodec{}, nil
  452. case reflect.Interface:
  453. if typ.NumMethod() == 0 {
  454. return &emptyInterfaceCodec{}, nil
  455. } else {
  456. return &nonEmptyInterfaceCodec{}, nil
  457. }
  458. case reflect.Struct:
  459. return prefix(fmt.Sprintf("[%s]", typeName)).addToEncoder(encoderOfStruct(cfg, typ))
  460. case reflect.Array:
  461. return prefix("[array]").addToEncoder(encoderOfArray(cfg, typ))
  462. case reflect.Slice:
  463. return prefix("[slice]").addToEncoder(encoderOfSlice(cfg, typ))
  464. case reflect.Map:
  465. return prefix("[map]").addToEncoder(encoderOfMap(cfg, typ))
  466. case reflect.Ptr:
  467. return prefix("[optional]").addToEncoder(encoderOfOptional(cfg, typ))
  468. default:
  469. return nil, fmt.Errorf("unsupported type: %v", typ)
  470. }
  471. }
  472. func decoderOfOptional(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) {
  473. elemType := typ.Elem()
  474. decoder, err := decoderOfType(cfg, elemType)
  475. if err != nil {
  476. return nil, err
  477. }
  478. return &optionalDecoder{elemType, decoder}, nil
  479. }
  480. func encoderOfOptional(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  481. elemType := typ.Elem()
  482. elemEncoder, err := encoderOfType(cfg, elemType)
  483. if err != nil {
  484. return nil, err
  485. }
  486. encoder := &optionalEncoder{elemEncoder}
  487. if elemType.Kind() == reflect.Map {
  488. encoder = &optionalEncoder{encoder}
  489. }
  490. return encoder, nil
  491. }
  492. func decoderOfMap(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) {
  493. decoder, err := decoderOfType(cfg, typ.Elem())
  494. if err != nil {
  495. return nil, err
  496. }
  497. mapInterface := reflect.New(typ).Interface()
  498. return &mapDecoder{typ, typ.Key(), typ.Elem(), decoder, extractInterface(mapInterface)}, nil
  499. }
  500. func extractInterface(val interface{}) emptyInterface {
  501. return *((*emptyInterface)(unsafe.Pointer(&val)))
  502. }
  503. func encoderOfMap(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
  504. elemType := typ.Elem()
  505. encoder, err := encoderOfType(cfg, elemType)
  506. if err != nil {
  507. return nil, err
  508. }
  509. mapInterface := reflect.New(typ).Elem().Interface()
  510. if cfg.sortMapKeys {
  511. return &sortKeysMapEncoder{typ, elemType, encoder, *((*emptyInterface)(unsafe.Pointer(&mapInterface)))}, nil
  512. } else {
  513. return &mapEncoder{typ, elemType, encoder, *((*emptyInterface)(unsafe.Pointer(&mapInterface)))}, nil
  514. }
  515. }