feature_reflect.go 15 KB

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