feature_reflect.go 16 KB

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