feature_reflect.go 14 KB

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