feature_reflect.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477
  1. package jsoniter
  2. import (
  3. "fmt"
  4. "reflect"
  5. "sync/atomic"
  6. "unsafe"
  7. "errors"
  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. encode(ptr unsafe.Pointer, stream *Stream)
  22. encodeInterface(val interface{}, stream *Stream)
  23. }
  24. func WriteToStream(val interface{}, stream *Stream, encoder Encoder) {
  25. e := (*emptyInterface)(unsafe.Pointer(&val))
  26. if reflect.TypeOf(val).Kind() == reflect.Ptr {
  27. encoder.encode(unsafe.Pointer(&e.word), stream)
  28. } else {
  29. encoder.encode(e.word, stream)
  30. }
  31. }
  32. type DecoderFunc func(ptr unsafe.Pointer, iter *Iterator)
  33. type EncoderFunc func(ptr unsafe.Pointer, stream *Stream)
  34. type ExtensionFunc func(typ reflect.Type, field *reflect.StructField) ([]string, DecoderFunc)
  35. type funcDecoder struct {
  36. fun DecoderFunc
  37. }
  38. func (decoder *funcDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  39. decoder.fun(ptr, iter)
  40. }
  41. type funcEncoder struct {
  42. fun EncoderFunc
  43. }
  44. func (encoder *funcEncoder) encode(ptr unsafe.Pointer, stream *Stream) {
  45. encoder.fun(ptr, stream)
  46. }
  47. func (encoder *funcEncoder) encodeInterface(val interface{}, stream *Stream) {
  48. WriteToStream(val, stream, encoder)
  49. }
  50. var DECODERS unsafe.Pointer
  51. var ENCODERS unsafe.Pointer
  52. var typeDecoders map[string]Decoder
  53. var fieldDecoders map[string]Decoder
  54. var typeEncoders map[string]Encoder
  55. var fieldEncoders map[string]Encoder
  56. var extensions []ExtensionFunc
  57. var anyType reflect.Type
  58. func init() {
  59. typeDecoders = map[string]Decoder{}
  60. fieldDecoders = map[string]Decoder{}
  61. typeEncoders = map[string]Encoder{}
  62. fieldEncoders = map[string]Encoder{}
  63. extensions = []ExtensionFunc{}
  64. atomic.StorePointer(&DECODERS, unsafe.Pointer(&map[string]Decoder{}))
  65. atomic.StorePointer(&ENCODERS, unsafe.Pointer(&map[string]Encoder{}))
  66. anyType = reflect.TypeOf((*Any)(nil)).Elem()
  67. }
  68. func addDecoderToCache(cacheKey reflect.Type, decoder Decoder) {
  69. done := false
  70. for !done {
  71. ptr := atomic.LoadPointer(&DECODERS)
  72. cache := *(*map[reflect.Type]Decoder)(ptr)
  73. copied := map[reflect.Type]Decoder{}
  74. for k, v := range cache {
  75. copied[k] = v
  76. }
  77. copied[cacheKey] = decoder
  78. done = atomic.CompareAndSwapPointer(&DECODERS, ptr, unsafe.Pointer(&copied))
  79. }
  80. }
  81. func addEncoderToCache(cacheKey reflect.Type, encoder Encoder) {
  82. done := false
  83. for !done {
  84. ptr := atomic.LoadPointer(&ENCODERS)
  85. cache := *(*map[reflect.Type]Encoder)(ptr)
  86. copied := map[reflect.Type]Encoder{}
  87. for k, v := range cache {
  88. copied[k] = v
  89. }
  90. copied[cacheKey] = encoder
  91. done = atomic.CompareAndSwapPointer(&ENCODERS, ptr, unsafe.Pointer(&copied))
  92. }
  93. }
  94. func getDecoderFromCache(cacheKey reflect.Type) Decoder {
  95. ptr := atomic.LoadPointer(&DECODERS)
  96. cache := *(*map[reflect.Type]Decoder)(ptr)
  97. return cache[cacheKey]
  98. }
  99. func getEncoderFromCache(cacheKey reflect.Type) Encoder {
  100. ptr := atomic.LoadPointer(&ENCODERS)
  101. cache := *(*map[reflect.Type]Encoder)(ptr)
  102. return cache[cacheKey]
  103. }
  104. // RegisterTypeDecoder can register a type for json object
  105. func RegisterTypeDecoder(typ string, fun DecoderFunc) {
  106. typeDecoders[typ] = &funcDecoder{fun}
  107. }
  108. // RegisterFieldDecoder can register a type for json field
  109. func RegisterFieldDecoder(typ string, field string, fun DecoderFunc) {
  110. fieldDecoders[fmt.Sprintf("%s/%s", typ, field)] = &funcDecoder{fun}
  111. }
  112. func RegisterTypeEncoder(typ string, fun EncoderFunc) {
  113. typeEncoders[typ] = &funcEncoder{fun}
  114. }
  115. func RegisterFieldEncoder(typ string, field string, fun EncoderFunc) {
  116. fieldEncoders[fmt.Sprintf("%s/%s", typ, field)] = &funcEncoder{fun}
  117. }
  118. // RegisterExtension can register a custom extension
  119. func RegisterExtension(extension ExtensionFunc) {
  120. extensions = append(extensions, extension)
  121. }
  122. // CleanDecoders cleans decoders registered
  123. func CleanDecoders() {
  124. typeDecoders = map[string]Decoder{}
  125. fieldDecoders = map[string]Decoder{}
  126. }
  127. type optionalDecoder struct {
  128. valueType reflect.Type
  129. valueDecoder Decoder
  130. }
  131. func (decoder *optionalDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  132. if iter.ReadNil() {
  133. *((*unsafe.Pointer)(ptr)) = nil
  134. } else {
  135. if *((*unsafe.Pointer)(ptr)) == nil {
  136. // pointer to null, we have to allocate memory to hold the value
  137. value := reflect.New(decoder.valueType)
  138. decoder.valueDecoder.decode(unsafe.Pointer(value.Pointer()), iter)
  139. *((*uintptr)(ptr)) = value.Pointer()
  140. } else {
  141. // reuse existing instance
  142. decoder.valueDecoder.decode(*((*unsafe.Pointer)(ptr)), iter)
  143. }
  144. }
  145. }
  146. type optionalEncoder struct {
  147. valueType reflect.Type
  148. valueEncoder Encoder
  149. }
  150. func (encoder *optionalEncoder) encode(ptr unsafe.Pointer, stream *Stream) {
  151. if *((*unsafe.Pointer)(ptr)) == nil {
  152. stream.WriteNil()
  153. } else {
  154. encoder.valueEncoder.encode(*((*unsafe.Pointer)(ptr)), stream)
  155. }
  156. }
  157. func (encoder *optionalEncoder) encodeInterface(val interface{}, stream *Stream) {
  158. WriteToStream(val, stream, encoder)
  159. }
  160. type mapDecoder struct {
  161. mapType reflect.Type
  162. elemType reflect.Type
  163. elemDecoder Decoder
  164. mapInterface emptyInterface
  165. }
  166. func (decoder *mapDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  167. // dark magic to cast unsafe.Pointer back to interface{} using reflect.Type
  168. mapInterface := decoder.mapInterface
  169. mapInterface.word = ptr
  170. realInterface := (*interface{})(unsafe.Pointer(&mapInterface))
  171. realVal := reflect.ValueOf(*realInterface).Elem()
  172. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  173. elem := reflect.New(decoder.elemType)
  174. decoder.elemDecoder.decode(unsafe.Pointer(elem.Pointer()), iter)
  175. // to put into map, we have to use reflection
  176. realVal.SetMapIndex(reflect.ValueOf(string([]byte(field))), elem.Elem())
  177. }
  178. }
  179. type mapEncoder struct {
  180. mapType reflect.Type
  181. elemType reflect.Type
  182. elemEncoder Encoder
  183. mapInterface emptyInterface
  184. }
  185. func (encoder *mapEncoder) encode(ptr unsafe.Pointer, stream *Stream) {
  186. mapInterface := encoder.mapInterface
  187. mapInterface.word = ptr
  188. realInterface := (*interface{})(unsafe.Pointer(&mapInterface))
  189. realVal := reflect.ValueOf(*realInterface)
  190. stream.WriteObjectStart()
  191. for i, key := range realVal.MapKeys() {
  192. if i != 0 {
  193. stream.WriteMore()
  194. }
  195. stream.WriteObjectField(key.String())
  196. val := realVal.MapIndex(key).Interface()
  197. encoder.elemEncoder.encodeInterface(val, stream)
  198. }
  199. stream.WriteObjectEnd()
  200. }
  201. func (encoder *mapEncoder) encodeInterface(val interface{}, stream *Stream) {
  202. WriteToStream(val, stream, encoder)
  203. }
  204. type mapInterfaceEncoder struct {
  205. mapType reflect.Type
  206. elemType reflect.Type
  207. elemEncoder Encoder
  208. mapInterface emptyInterface
  209. }
  210. func (encoder *mapInterfaceEncoder) encode(ptr unsafe.Pointer, stream *Stream) {
  211. mapInterface := encoder.mapInterface
  212. mapInterface.word = ptr
  213. realInterface := (*interface{})(unsafe.Pointer(&mapInterface))
  214. realVal := reflect.ValueOf(*realInterface)
  215. stream.WriteObjectStart()
  216. for i, key := range realVal.MapKeys() {
  217. if i != 0 {
  218. stream.WriteMore()
  219. }
  220. stream.WriteObjectField(key.String())
  221. val := realVal.MapIndex(key).Interface()
  222. encoder.elemEncoder.encode(unsafe.Pointer(&val), stream)
  223. }
  224. stream.WriteObjectEnd()
  225. }
  226. func (encoder *mapInterfaceEncoder) encodeInterface(val interface{}, stream *Stream) {
  227. WriteToStream(val, stream, encoder)
  228. }
  229. // emptyInterface is the header for an interface{} value.
  230. type emptyInterface struct {
  231. typ *struct{}
  232. word unsafe.Pointer
  233. }
  234. // Read converts an Iterator instance into go interface, same as json.Unmarshal
  235. func (iter *Iterator) ReadVal(obj interface{}) {
  236. typ := reflect.TypeOf(obj)
  237. cacheKey := typ.Elem()
  238. cachedDecoder := getDecoderFromCache(cacheKey)
  239. if cachedDecoder == nil {
  240. decoder, err := decoderOfType(cacheKey)
  241. if err != nil {
  242. iter.Error = err
  243. return
  244. }
  245. cachedDecoder = decoder
  246. addDecoderToCache(cacheKey, decoder)
  247. }
  248. e := (*emptyInterface)(unsafe.Pointer(&obj))
  249. cachedDecoder.decode(e.word, iter)
  250. }
  251. func (stream *Stream) WriteVal(val interface{}) {
  252. if nil == val {
  253. stream.WriteNil()
  254. return
  255. }
  256. typ := reflect.TypeOf(val)
  257. cacheKey := typ
  258. cachedEncoder := getEncoderFromCache(cacheKey)
  259. if cachedEncoder == nil {
  260. encoder, err := encoderOfType(cacheKey)
  261. if err != nil {
  262. stream.Error = err
  263. return
  264. }
  265. cachedEncoder = encoder
  266. addEncoderToCache(cacheKey, encoder)
  267. }
  268. cachedEncoder.encodeInterface(val, stream)
  269. }
  270. type prefix string
  271. func (p prefix) addToDecoder(decoder Decoder, err error) (Decoder, error) {
  272. if err != nil {
  273. return nil, fmt.Errorf("%s: %s", p, err.Error())
  274. }
  275. return decoder, err
  276. }
  277. func (p prefix) addToEncoder(encoder Encoder, err error) (Encoder, error) {
  278. if err != nil {
  279. return nil, fmt.Errorf("%s: %s", p, err.Error())
  280. }
  281. return encoder, err
  282. }
  283. func decoderOfType(typ reflect.Type) (Decoder, error) {
  284. typeName := typ.String()
  285. typeDecoder := typeDecoders[typeName]
  286. if typeDecoder != nil {
  287. return typeDecoder, nil
  288. }
  289. switch typ.Kind() {
  290. case reflect.String:
  291. return &stringCodec{}, nil
  292. case reflect.Int:
  293. return &intCodec{}, nil
  294. case reflect.Int8:
  295. return &int8Codec{}, nil
  296. case reflect.Int16:
  297. return &int16Codec{}, nil
  298. case reflect.Int32:
  299. return &int32Codec{}, nil
  300. case reflect.Int64:
  301. return &int64Codec{}, nil
  302. case reflect.Uint:
  303. return &uintCodec{}, nil
  304. case reflect.Uint8:
  305. return &uint8Codec{}, nil
  306. case reflect.Uint16:
  307. return &uint16Codec{}, nil
  308. case reflect.Uint32:
  309. return &uint32Codec{}, nil
  310. case reflect.Uint64:
  311. return &uint64Codec{}, nil
  312. case reflect.Float32:
  313. return &float32Codec{}, nil
  314. case reflect.Float64:
  315. return &float64Codec{}, nil
  316. case reflect.Bool:
  317. return &boolCodec{}, nil
  318. case reflect.Interface:
  319. if typ.NumMethod() == 0 {
  320. return &interfaceCodec{}, nil
  321. } else {
  322. return nil, errors.New("unsupportd type: " + typ.String())
  323. }
  324. case reflect.Struct:
  325. return prefix(fmt.Sprintf("[%s]", typeName)).addToDecoder(decoderOfStruct(typ))
  326. case reflect.Slice:
  327. return prefix("[slice]").addToDecoder(decoderOfSlice(typ))
  328. case reflect.Map:
  329. return prefix("[map]").addToDecoder(decoderOfMap(typ))
  330. case reflect.Ptr:
  331. return prefix("[optional]").addToDecoder(decoderOfOptional(typ))
  332. default:
  333. return nil, fmt.Errorf("unsupported type: %v", typ)
  334. }
  335. }
  336. func encoderOfType(typ reflect.Type) (Encoder, error) {
  337. if typ.ConvertibleTo(anyType) {
  338. return &anyCodec{}, nil
  339. }
  340. typeName := typ.String()
  341. typeEncoder := typeEncoders[typeName]
  342. if typeEncoder != nil {
  343. return typeEncoder, nil
  344. }
  345. switch typ.Kind() {
  346. case reflect.String:
  347. return &stringCodec{}, nil
  348. case reflect.Int:
  349. return &intCodec{}, nil
  350. case reflect.Int8:
  351. return &int8Codec{}, nil
  352. case reflect.Int16:
  353. return &int16Codec{}, nil
  354. case reflect.Int32:
  355. return &int32Codec{}, nil
  356. case reflect.Int64:
  357. return &int64Codec{}, nil
  358. case reflect.Uint:
  359. return &uintCodec{}, nil
  360. case reflect.Uint8:
  361. return &uint8Codec{}, nil
  362. case reflect.Uint16:
  363. return &uint16Codec{}, nil
  364. case reflect.Uint32:
  365. return &uint32Codec{}, nil
  366. case reflect.Uint64:
  367. return &uint64Codec{}, nil
  368. case reflect.Float32:
  369. return &float32Codec{}, nil
  370. case reflect.Float64:
  371. return &float64Codec{}, nil
  372. case reflect.Bool:
  373. return &boolCodec{}, nil
  374. case reflect.Interface:
  375. return &interfaceCodec{}, nil
  376. case reflect.Struct:
  377. return prefix(fmt.Sprintf("[%s]", typeName)).addToEncoder(encoderOfStruct(typ))
  378. case reflect.Slice:
  379. return prefix("[slice]").addToEncoder(encoderOfSlice(typ))
  380. case reflect.Map:
  381. return prefix("[map]").addToEncoder(encoderOfMap(typ))
  382. case reflect.Ptr:
  383. return prefix("[optional]").addToEncoder(encoderOfOptional(typ))
  384. default:
  385. return nil, fmt.Errorf("unsupported type: %v", typ)
  386. }
  387. }
  388. func decoderOfOptional(typ reflect.Type) (Decoder, error) {
  389. elemType := typ.Elem()
  390. decoder, err := decoderOfType(elemType)
  391. if err != nil {
  392. return nil, err
  393. }
  394. return &optionalDecoder{elemType, decoder}, nil
  395. }
  396. func encoderOfOptional(typ reflect.Type) (Encoder, error) {
  397. elemType := typ.Elem()
  398. decoder, err := encoderOfType(elemType)
  399. if err != nil {
  400. return nil, err
  401. }
  402. return &optionalEncoder{elemType, decoder}, nil
  403. }
  404. func decoderOfMap(typ reflect.Type) (Decoder, error) {
  405. decoder, err := decoderOfType(typ.Elem())
  406. if err != nil {
  407. return nil, err
  408. }
  409. mapInterface := reflect.New(typ).Interface()
  410. return &mapDecoder{typ, typ.Elem(), decoder, *((*emptyInterface)(unsafe.Pointer(&mapInterface)))}, nil
  411. }
  412. func encoderOfMap(typ reflect.Type) (Encoder, error) {
  413. elemType := typ.Elem()
  414. encoder, err := encoderOfType(elemType)
  415. if err != nil {
  416. return nil, err
  417. }
  418. mapInterface := reflect.New(typ).Elem().Interface()
  419. if elemType.Kind() == reflect.Interface && elemType.NumMethod() == 0 {
  420. return &mapInterfaceEncoder{typ, elemType, encoder, *((*emptyInterface)(unsafe.Pointer(&mapInterface)))}, nil
  421. } else {
  422. return &mapEncoder{typ, elemType, encoder, *((*emptyInterface)(unsafe.Pointer(&mapInterface)))}, nil
  423. }
  424. }