feature_reflect.go 13 KB

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