feature_reflect.go 14 KB

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