feature_reflect.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. package jsoniter
  2. import (
  3. "fmt"
  4. "reflect"
  5. "sync/atomic"
  6. "unsafe"
  7. )
  8. /*
  9. Reflection on type to create decoders, which is then cached
  10. Reflection on value is avoided as we can, as the reflect.Value itself will allocate, with following exceptions
  11. 1. create instance of new value, for example *int will need a int to be allocated
  12. 2. append to slice, if the existing cap is not enough, allocate will be done using Reflect.New
  13. 3. assignment to map, both key and value will be reflect.Value
  14. For a simple struct binding, it will be reflect.Value free and allocation free
  15. */
  16. type Decoder interface {
  17. decode(ptr unsafe.Pointer, iter *Iterator)
  18. }
  19. type Encoder interface {
  20. encode(ptr unsafe.Pointer, stream *Stream)
  21. }
  22. type DecoderFunc func(ptr unsafe.Pointer, iter *Iterator)
  23. type ExtensionFunc func(typ reflect.Type, field *reflect.StructField) ([]string, DecoderFunc)
  24. type funcDecoder struct {
  25. fun DecoderFunc
  26. }
  27. func (decoder *funcDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  28. decoder.fun(ptr, iter)
  29. }
  30. var DECODERS unsafe.Pointer
  31. var ENCODERS unsafe.Pointer
  32. var typeDecoders map[string]Decoder
  33. var fieldDecoders map[string]Decoder
  34. var extensions []ExtensionFunc
  35. func init() {
  36. typeDecoders = map[string]Decoder{}
  37. fieldDecoders = map[string]Decoder{}
  38. extensions = []ExtensionFunc{}
  39. atomic.StorePointer(&DECODERS, unsafe.Pointer(&map[string]Decoder{}))
  40. atomic.StorePointer(&ENCODERS, unsafe.Pointer(&map[string]Encoder{}))
  41. }
  42. func addDecoderToCache(cacheKey reflect.Type, decoder Decoder) {
  43. done := false
  44. for !done {
  45. ptr := atomic.LoadPointer(&DECODERS)
  46. cache := *(*map[reflect.Type]Decoder)(ptr)
  47. copied := map[reflect.Type]Decoder{}
  48. for k, v := range cache {
  49. copied[k] = v
  50. }
  51. copied[cacheKey] = decoder
  52. done = atomic.CompareAndSwapPointer(&DECODERS, ptr, unsafe.Pointer(&copied))
  53. }
  54. }
  55. func addEncoderToCache(cacheKey reflect.Type, encoder Encoder) {
  56. done := false
  57. for !done {
  58. ptr := atomic.LoadPointer(&ENCODERS)
  59. cache := *(*map[reflect.Type]Encoder)(ptr)
  60. copied := map[reflect.Type]Encoder{}
  61. for k, v := range cache {
  62. copied[k] = v
  63. }
  64. copied[cacheKey] = encoder
  65. done = atomic.CompareAndSwapPointer(&ENCODERS, ptr, unsafe.Pointer(&copied))
  66. }
  67. }
  68. func getDecoderFromCache(cacheKey reflect.Type) Decoder {
  69. ptr := atomic.LoadPointer(&DECODERS)
  70. cache := *(*map[reflect.Type]Decoder)(ptr)
  71. return cache[cacheKey]
  72. }
  73. func getEncoderFromCache(cacheKey reflect.Type) Encoder {
  74. ptr := atomic.LoadPointer(&ENCODERS)
  75. cache := *(*map[reflect.Type]Encoder)(ptr)
  76. return cache[cacheKey]
  77. }
  78. // RegisterTypeDecoder can register a type for json object
  79. func RegisterTypeDecoder(typ string, fun DecoderFunc) {
  80. typeDecoders[typ] = &funcDecoder{fun}
  81. }
  82. // RegisterFieldDecoder can register a type for json field
  83. func RegisterFieldDecoder(typ string, field string, fun DecoderFunc) {
  84. fieldDecoders[fmt.Sprintf("%s/%s", typ, field)] = &funcDecoder{fun}
  85. }
  86. // RegisterExtension can register a custom extension
  87. func RegisterExtension(extension ExtensionFunc) {
  88. extensions = append(extensions, extension)
  89. }
  90. // CleanDecoders cleans decoders registered
  91. func CleanDecoders() {
  92. typeDecoders = map[string]Decoder{}
  93. fieldDecoders = map[string]Decoder{}
  94. }
  95. type optionalDecoder struct {
  96. valueType reflect.Type
  97. valueDecoder Decoder
  98. }
  99. func (decoder *optionalDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  100. if iter.ReadNil() {
  101. *((*unsafe.Pointer)(ptr)) = nil
  102. } else {
  103. if *((*unsafe.Pointer)(ptr)) == nil {
  104. // pointer to null, we have to allocate memory to hold the value
  105. value := reflect.New(decoder.valueType)
  106. decoder.valueDecoder.decode(unsafe.Pointer(value.Pointer()), iter)
  107. *((*uintptr)(ptr)) = value.Pointer()
  108. } else {
  109. // reuse existing instance
  110. decoder.valueDecoder.decode(*((*unsafe.Pointer)(ptr)), iter)
  111. }
  112. }
  113. }
  114. type optionalEncoder struct {
  115. valueType reflect.Type
  116. valueEncoder Encoder
  117. }
  118. func (encoder *optionalEncoder) encode(ptr unsafe.Pointer, stream *Stream) {
  119. if *((*unsafe.Pointer)(ptr)) == nil {
  120. stream.WriteNil()
  121. } else {
  122. encoder.valueEncoder.encode(*((*unsafe.Pointer)(ptr)), stream)
  123. }
  124. }
  125. type mapDecoder struct {
  126. mapType reflect.Type
  127. elemType reflect.Type
  128. elemDecoder Decoder
  129. mapInterface emptyInterface
  130. }
  131. func (decoder *mapDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  132. // dark magic to cast unsafe.Pointer back to interface{} using reflect.Type
  133. mapInterface := decoder.mapInterface
  134. mapInterface.word = ptr
  135. realInterface := (*interface{})(unsafe.Pointer(&mapInterface))
  136. realVal := reflect.ValueOf(*realInterface).Elem()
  137. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  138. elem := reflect.New(decoder.elemType)
  139. decoder.elemDecoder.decode(unsafe.Pointer(elem.Pointer()), iter)
  140. // to put into map, we have to use reflection
  141. realVal.SetMapIndex(reflect.ValueOf(string([]byte(field))), elem.Elem())
  142. }
  143. }
  144. type mapEncoder struct {
  145. mapType reflect.Type
  146. elemType reflect.Type
  147. elemEncoder Encoder
  148. mapInterface emptyInterface
  149. }
  150. func (encoder *mapEncoder) encode(ptr unsafe.Pointer, stream *Stream) {
  151. mapInterface := encoder.mapInterface
  152. mapInterface.word = ptr
  153. realInterface := (*interface{})(unsafe.Pointer(&mapInterface))
  154. realVal := reflect.ValueOf(*realInterface)
  155. stream.WriteObjectStart()
  156. for i, key := range realVal.MapKeys() {
  157. if i != 0 {
  158. stream.WriteMore()
  159. }
  160. stream.WriteObjectField(key.String())
  161. val := realVal.MapIndex(key).Interface()
  162. e := (*emptyInterface)(unsafe.Pointer(&val))
  163. encoder.elemEncoder.encode(e.word, stream)
  164. }
  165. stream.WriteObjectEnd()
  166. }
  167. // emptyInterface is the header for an interface{} value.
  168. type emptyInterface struct {
  169. typ *struct{}
  170. word unsafe.Pointer
  171. }
  172. // Read converts an Iterator instance into go interface, same as json.Unmarshal
  173. func (iter *Iterator) ReadVal(obj interface{}) {
  174. typ := reflect.TypeOf(obj)
  175. cacheKey := typ.Elem()
  176. cachedDecoder := getDecoderFromCache(cacheKey)
  177. if cachedDecoder == nil {
  178. decoder, err := decoderOfType(cacheKey)
  179. if err != nil {
  180. iter.Error = err
  181. return
  182. }
  183. cachedDecoder = decoder
  184. addDecoderToCache(cacheKey, decoder)
  185. }
  186. e := (*emptyInterface)(unsafe.Pointer(&obj))
  187. cachedDecoder.decode(e.word, iter)
  188. }
  189. func (stream *Stream) WriteVal(val interface{}) {
  190. if nil == val {
  191. stream.WriteNil()
  192. return
  193. }
  194. typ := reflect.TypeOf(val)
  195. cacheKey := typ
  196. cachedEncoder := getEncoderFromCache(cacheKey)
  197. if cachedEncoder == nil {
  198. encoder, err := encoderOfType(cacheKey)
  199. if err != nil {
  200. stream.Error = err
  201. return
  202. }
  203. cachedEncoder = encoder
  204. addEncoderToCache(cacheKey, encoder)
  205. }
  206. e := (*emptyInterface)(unsafe.Pointer(&val))
  207. if typ.Kind() == reflect.Ptr {
  208. cachedEncoder.encode(unsafe.Pointer(&e.word), stream)
  209. } else {
  210. cachedEncoder.encode(e.word, stream)
  211. }
  212. }
  213. type prefix string
  214. func (p prefix) addToDecoder(decoder Decoder, err error) (Decoder, error) {
  215. if err != nil {
  216. return nil, fmt.Errorf("%s: %s", p, err.Error())
  217. }
  218. return decoder, err
  219. }
  220. func (p prefix) addToEncoder(encoder Encoder, err error) (Encoder, error) {
  221. if err != nil {
  222. return nil, fmt.Errorf("%s: %s", p, err.Error())
  223. }
  224. return encoder, err
  225. }
  226. func decoderOfType(typ reflect.Type) (Decoder, error) {
  227. typeName := typ.String()
  228. typeDecoder := typeDecoders[typeName]
  229. if typeDecoder != nil {
  230. return typeDecoder, nil
  231. }
  232. switch typ.Kind() {
  233. case reflect.String:
  234. return &stringCodec{}, nil
  235. case reflect.Int:
  236. return &intCodec{}, nil
  237. case reflect.Int8:
  238. return &int8Codec{}, nil
  239. case reflect.Int16:
  240. return &int16Codec{}, nil
  241. case reflect.Int32:
  242. return &int32Codec{}, nil
  243. case reflect.Int64:
  244. return &int64Codec{}, nil
  245. case reflect.Uint:
  246. return &uintCodec{}, nil
  247. case reflect.Uint8:
  248. return &uint8Codec{}, nil
  249. case reflect.Uint16:
  250. return &uint16Codec{}, nil
  251. case reflect.Uint32:
  252. return &uint32Codec{}, nil
  253. case reflect.Uint64:
  254. return &uint64Codec{}, nil
  255. case reflect.Float32:
  256. return &float32Codec{}, nil
  257. case reflect.Float64:
  258. return &float64Codec{}, nil
  259. case reflect.Bool:
  260. return &boolCodec{}, nil
  261. case reflect.Interface:
  262. return &interfaceCodec{}, nil
  263. case reflect.Struct:
  264. return prefix(fmt.Sprintf("[%s]", typeName)).addToDecoder(decoderOfStruct(typ))
  265. case reflect.Slice:
  266. return prefix("[slice]").addToDecoder(decoderOfSlice(typ))
  267. case reflect.Map:
  268. return prefix("[map]").addToDecoder(decoderOfMap(typ))
  269. case reflect.Ptr:
  270. return prefix("[optional]").addToDecoder(decoderOfOptional(typ))
  271. default:
  272. return nil, fmt.Errorf("unsupported type: %v", typ)
  273. }
  274. }
  275. func encoderOfType(typ reflect.Type) (Encoder, error) {
  276. typeName := typ.String()
  277. switch typ.Kind() {
  278. case reflect.String:
  279. return &stringCodec{}, nil
  280. case reflect.Int:
  281. return &intCodec{}, nil
  282. case reflect.Int8:
  283. return &int8Codec{}, nil
  284. case reflect.Int16:
  285. return &int16Codec{}, nil
  286. case reflect.Int32:
  287. return &int32Codec{}, nil
  288. case reflect.Int64:
  289. return &int64Codec{}, nil
  290. case reflect.Uint:
  291. return &uintCodec{}, nil
  292. case reflect.Uint8:
  293. return &uint8Codec{}, nil
  294. case reflect.Uint16:
  295. return &uint16Codec{}, nil
  296. case reflect.Uint32:
  297. return &uint32Codec{}, nil
  298. case reflect.Uint64:
  299. return &uint64Codec{}, nil
  300. case reflect.Float32:
  301. return &float32Codec{}, nil
  302. case reflect.Float64:
  303. return &float64Codec{}, nil
  304. case reflect.Bool:
  305. return &boolCodec{}, nil
  306. case reflect.Interface:
  307. return &interfaceCodec{}, nil
  308. case reflect.Struct:
  309. return prefix(fmt.Sprintf("[%s]", typeName)).addToEncoder(encoderOfStruct(typ))
  310. case reflect.Slice:
  311. return prefix("[slice]").addToEncoder(encoderOfSlice(typ))
  312. case reflect.Map:
  313. return prefix("[map]").addToEncoder(encoderOfMap(typ))
  314. case reflect.Ptr:
  315. return prefix("[optional]").addToEncoder(encoderOfOptional(typ))
  316. default:
  317. return nil, fmt.Errorf("unsupported type: %v", typ)
  318. }
  319. }
  320. func decoderOfOptional(typ reflect.Type) (Decoder, error) {
  321. elemType := typ.Elem()
  322. decoder, err := decoderOfType(elemType)
  323. if err != nil {
  324. return nil, err
  325. }
  326. return &optionalDecoder{elemType, decoder}, nil
  327. }
  328. func encoderOfOptional(typ reflect.Type) (Encoder, error) {
  329. elemType := typ.Elem()
  330. decoder, err := encoderOfType(elemType)
  331. if err != nil {
  332. return nil, err
  333. }
  334. return &optionalEncoder{elemType, decoder}, nil
  335. }
  336. func decoderOfMap(typ reflect.Type) (Decoder, error) {
  337. decoder, err := decoderOfType(typ.Elem())
  338. if err != nil {
  339. return nil, err
  340. }
  341. mapInterface := reflect.New(typ).Interface()
  342. return &mapDecoder{typ, typ.Elem(), decoder, *((*emptyInterface)(unsafe.Pointer(&mapInterface)))}, nil
  343. }
  344. func encoderOfMap(typ reflect.Type) (Encoder, error) {
  345. encoder, err := encoderOfType(typ.Elem())
  346. if err != nil {
  347. return nil, err
  348. }
  349. mapInterface := reflect.New(typ).Elem().Interface()
  350. return &mapEncoder{typ, typ.Elem(), encoder, *((*emptyInterface)(unsafe.Pointer(&mapInterface)))}, nil
  351. }