feature_reflect.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479
  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. if realVal.IsNil() {
  173. realVal.Set(reflect.MakeMap(realVal.Type()))
  174. }
  175. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  176. elem := reflect.New(decoder.elemType)
  177. decoder.elemDecoder.decode(unsafe.Pointer(elem.Pointer()), iter)
  178. // to put into map, we have to use reflection
  179. realVal.SetMapIndex(reflect.ValueOf(string([]byte(field))), elem.Elem())
  180. }
  181. }
  182. type mapEncoder struct {
  183. mapType reflect.Type
  184. elemType reflect.Type
  185. elemEncoder Encoder
  186. mapInterface emptyInterface
  187. }
  188. func (encoder *mapEncoder) encode(ptr unsafe.Pointer, stream *Stream) {
  189. mapInterface := encoder.mapInterface
  190. mapInterface.word = ptr
  191. realInterface := (*interface{})(unsafe.Pointer(&mapInterface))
  192. realVal := reflect.ValueOf(*realInterface)
  193. stream.WriteObjectStart()
  194. for i, key := range realVal.MapKeys() {
  195. if i != 0 {
  196. stream.WriteMore()
  197. }
  198. stream.WriteObjectField(key.String())
  199. val := realVal.MapIndex(key).Interface()
  200. encoder.elemEncoder.encodeInterface(val, stream)
  201. }
  202. stream.WriteObjectEnd()
  203. }
  204. func (encoder *mapEncoder) encodeInterface(val interface{}, stream *Stream) {
  205. WriteToStream(val, stream, encoder)
  206. }
  207. type mapInterfaceEncoder struct {
  208. mapType reflect.Type
  209. elemType reflect.Type
  210. elemEncoder Encoder
  211. mapInterface emptyInterface
  212. }
  213. func (encoder *mapInterfaceEncoder) encode(ptr unsafe.Pointer, stream *Stream) {
  214. mapInterface := encoder.mapInterface
  215. mapInterface.word = ptr
  216. realInterface := (*interface{})(unsafe.Pointer(&mapInterface))
  217. realVal := reflect.ValueOf(*realInterface)
  218. stream.WriteObjectStart()
  219. for i, key := range realVal.MapKeys() {
  220. if i != 0 {
  221. stream.WriteMore()
  222. }
  223. stream.WriteObjectField(key.String())
  224. val := realVal.MapIndex(key).Interface()
  225. encoder.elemEncoder.encode(unsafe.Pointer(&val), stream)
  226. }
  227. stream.WriteObjectEnd()
  228. }
  229. func (encoder *mapInterfaceEncoder) encodeInterface(val interface{}, stream *Stream) {
  230. WriteToStream(val, stream, encoder)
  231. }
  232. // emptyInterface is the header for an interface{} value.
  233. type emptyInterface struct {
  234. typ *struct{}
  235. word unsafe.Pointer
  236. }
  237. // Read converts an Iterator instance into go interface, same as json.Unmarshal
  238. func (iter *Iterator) ReadVal(obj interface{}) {
  239. typ := reflect.TypeOf(obj)
  240. cacheKey := typ.Elem()
  241. cachedDecoder := getDecoderFromCache(cacheKey)
  242. if cachedDecoder == nil {
  243. decoder, err := decoderOfType(cacheKey)
  244. if err != nil {
  245. iter.Error = err
  246. return
  247. }
  248. cachedDecoder = decoder
  249. addDecoderToCache(cacheKey, decoder)
  250. }
  251. e := (*emptyInterface)(unsafe.Pointer(&obj))
  252. cachedDecoder.decode(e.word, iter)
  253. }
  254. func (stream *Stream) WriteVal(val interface{}) {
  255. if nil == val {
  256. stream.WriteNil()
  257. return
  258. }
  259. typ := reflect.TypeOf(val)
  260. cacheKey := typ
  261. cachedEncoder := getEncoderFromCache(cacheKey)
  262. if cachedEncoder == nil {
  263. encoder, err := encoderOfType(cacheKey)
  264. if err != nil {
  265. stream.Error = err
  266. return
  267. }
  268. cachedEncoder = encoder
  269. addEncoderToCache(cacheKey, encoder)
  270. }
  271. cachedEncoder.encodeInterface(val, stream)
  272. }
  273. type prefix string
  274. func (p prefix) addToDecoder(decoder Decoder, err error) (Decoder, error) {
  275. if err != nil {
  276. return nil, fmt.Errorf("%s: %s", p, err.Error())
  277. }
  278. return decoder, err
  279. }
  280. func (p prefix) addToEncoder(encoder Encoder, err error) (Encoder, error) {
  281. if err != nil {
  282. return nil, fmt.Errorf("%s: %s", p, err.Error())
  283. }
  284. return encoder, err
  285. }
  286. func decoderOfType(typ reflect.Type) (Decoder, error) {
  287. typeName := typ.String()
  288. typeDecoder := typeDecoders[typeName]
  289. if typeDecoder != nil {
  290. return typeDecoder, nil
  291. }
  292. switch typ.Kind() {
  293. case reflect.String:
  294. return &stringCodec{}, nil
  295. case reflect.Int:
  296. return &intCodec{}, nil
  297. case reflect.Int8:
  298. return &int8Codec{}, nil
  299. case reflect.Int16:
  300. return &int16Codec{}, nil
  301. case reflect.Int32:
  302. return &int32Codec{}, nil
  303. case reflect.Int64:
  304. return &int64Codec{}, nil
  305. case reflect.Uint:
  306. return &uintCodec{}, nil
  307. case reflect.Uint8:
  308. return &uint8Codec{}, nil
  309. case reflect.Uint16:
  310. return &uint16Codec{}, nil
  311. case reflect.Uint32:
  312. return &uint32Codec{}, nil
  313. case reflect.Uint64:
  314. return &uint64Codec{}, nil
  315. case reflect.Float32:
  316. return &float32Codec{}, nil
  317. case reflect.Float64:
  318. return &float64Codec{}, nil
  319. case reflect.Bool:
  320. return &boolCodec{}, nil
  321. case reflect.Interface:
  322. if typ.NumMethod() == 0 {
  323. return &interfaceCodec{}, nil
  324. } else {
  325. return nil, errors.New("unsupportd type: " + typ.String())
  326. }
  327. case reflect.Struct:
  328. return prefix(fmt.Sprintf("[%s]", typeName)).addToDecoder(decoderOfStruct(typ))
  329. case reflect.Slice:
  330. return prefix("[slice]").addToDecoder(decoderOfSlice(typ))
  331. case reflect.Map:
  332. return prefix("[map]").addToDecoder(decoderOfMap(typ))
  333. case reflect.Ptr:
  334. return prefix("[optional]").addToDecoder(decoderOfOptional(typ))
  335. default:
  336. return nil, fmt.Errorf("unsupported type: %v", typ)
  337. }
  338. }
  339. func encoderOfType(typ reflect.Type) (Encoder, error) {
  340. if typ.ConvertibleTo(anyType) {
  341. return &anyCodec{}, nil
  342. }
  343. typeName := typ.String()
  344. typeEncoder := typeEncoders[typeName]
  345. if typeEncoder != nil {
  346. return typeEncoder, nil
  347. }
  348. switch typ.Kind() {
  349. case reflect.String:
  350. return &stringCodec{}, nil
  351. case reflect.Int:
  352. return &intCodec{}, nil
  353. case reflect.Int8:
  354. return &int8Codec{}, nil
  355. case reflect.Int16:
  356. return &int16Codec{}, nil
  357. case reflect.Int32:
  358. return &int32Codec{}, nil
  359. case reflect.Int64:
  360. return &int64Codec{}, nil
  361. case reflect.Uint:
  362. return &uintCodec{}, nil
  363. case reflect.Uint8:
  364. return &uint8Codec{}, nil
  365. case reflect.Uint16:
  366. return &uint16Codec{}, nil
  367. case reflect.Uint32:
  368. return &uint32Codec{}, nil
  369. case reflect.Uint64:
  370. return &uint64Codec{}, nil
  371. case reflect.Float32:
  372. return &float32Codec{}, nil
  373. case reflect.Float64:
  374. return &float64Codec{}, nil
  375. case reflect.Bool:
  376. return &boolCodec{}, nil
  377. case reflect.Interface:
  378. return &interfaceCodec{}, nil
  379. case reflect.Struct:
  380. return prefix(fmt.Sprintf("[%s]", typeName)).addToEncoder(encoderOfStruct(typ))
  381. case reflect.Slice:
  382. return prefix("[slice]").addToEncoder(encoderOfSlice(typ))
  383. case reflect.Map:
  384. return prefix("[map]").addToEncoder(encoderOfMap(typ))
  385. case reflect.Ptr:
  386. return prefix("[optional]").addToEncoder(encoderOfOptional(typ))
  387. default:
  388. return nil, fmt.Errorf("unsupported type: %v", typ)
  389. }
  390. }
  391. func decoderOfOptional(typ reflect.Type) (Decoder, error) {
  392. elemType := typ.Elem()
  393. decoder, err := decoderOfType(elemType)
  394. if err != nil {
  395. return nil, err
  396. }
  397. return &optionalDecoder{elemType, decoder}, nil
  398. }
  399. func encoderOfOptional(typ reflect.Type) (Encoder, error) {
  400. elemType := typ.Elem()
  401. decoder, err := encoderOfType(elemType)
  402. if err != nil {
  403. return nil, err
  404. }
  405. return &optionalEncoder{elemType, decoder}, nil
  406. }
  407. func decoderOfMap(typ reflect.Type) (Decoder, error) {
  408. decoder, err := decoderOfType(typ.Elem())
  409. if err != nil {
  410. return nil, err
  411. }
  412. mapInterface := reflect.New(typ).Interface()
  413. return &mapDecoder{typ, typ.Elem(), decoder, *((*emptyInterface)(unsafe.Pointer(&mapInterface)))}, nil
  414. }
  415. func encoderOfMap(typ reflect.Type) (Encoder, error) {
  416. elemType := typ.Elem()
  417. encoder, err := encoderOfType(elemType)
  418. if err != nil {
  419. return nil, err
  420. }
  421. mapInterface := reflect.New(typ).Elem().Interface()
  422. if elemType.Kind() == reflect.Interface && elemType.NumMethod() == 0 {
  423. return &mapInterfaceEncoder{typ, elemType, encoder, *((*emptyInterface)(unsafe.Pointer(&mapInterface)))}, nil
  424. } else {
  425. return &mapEncoder{typ, elemType, encoder, *((*emptyInterface)(unsafe.Pointer(&mapInterface)))}, nil
  426. }
  427. }