feature_reflect.go 15 KB

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