feature_reflect.go 14 KB

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