feature_reflect.go 14 KB

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