feature_reflect.go 14 KB

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