reflect.go 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. package jsoniter
  2. import (
  3. "encoding"
  4. "encoding/json"
  5. "fmt"
  6. "reflect"
  7. "time"
  8. "unsafe"
  9. "github.com/v2pro/plz/reflect2"
  10. )
  11. // ValDecoder is an internal type registered to cache as needed.
  12. // Don't confuse jsoniter.ValDecoder with json.Decoder.
  13. // For json.Decoder's adapter, refer to jsoniter.AdapterDecoder(todo link).
  14. //
  15. // Reflection on type to create decoders, which is then cached
  16. // Reflection on value is avoided as we can, as the reflect.Value itself will allocate, with following exceptions
  17. // 1. create instance of new value, for example *int will need a int to be allocated
  18. // 2. append to slice, if the existing cap is not enough, allocate will be done using Reflect.New
  19. // 3. assignment to map, both key and value will be reflect.Value
  20. // For a simple struct binding, it will be reflect.Value free and allocation free
  21. type ValDecoder interface {
  22. Decode(ptr unsafe.Pointer, iter *Iterator)
  23. }
  24. // ValEncoder is an internal type registered to cache as needed.
  25. // Don't confuse jsoniter.ValEncoder with json.Encoder.
  26. // For json.Encoder's adapter, refer to jsoniter.AdapterEncoder(todo godoc link).
  27. type ValEncoder interface {
  28. IsEmpty(ptr unsafe.Pointer) bool
  29. Encode(ptr unsafe.Pointer, stream *Stream)
  30. }
  31. type checkIsEmpty interface {
  32. IsEmpty(ptr unsafe.Pointer) bool
  33. }
  34. var jsonRawMessageType reflect.Type
  35. var jsoniterRawMessageType reflect.Type
  36. var marshalerType reflect.Type
  37. var unmarshalerType reflect.Type
  38. var textMarshalerType reflect.Type
  39. var textUnmarshalerType reflect.Type
  40. func init() {
  41. jsonRawMessageType = reflect.TypeOf((*json.RawMessage)(nil)).Elem()
  42. jsoniterRawMessageType = reflect.TypeOf((*RawMessage)(nil)).Elem()
  43. marshalerType = reflect.TypeOf((*json.Marshaler)(nil)).Elem()
  44. unmarshalerType = reflect.TypeOf((*json.Unmarshaler)(nil)).Elem()
  45. textMarshalerType = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem()
  46. textUnmarshalerType = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem()
  47. }
  48. // ReadVal copy the underlying JSON into go interface, same as json.Unmarshal
  49. func (iter *Iterator) ReadVal(obj interface{}) {
  50. typ := reflect.TypeOf(obj)
  51. cacheKey := typ.Elem()
  52. decoder := decoderOfType(iter.cfg, "", cacheKey)
  53. e := (*emptyInterface)(unsafe.Pointer(&obj))
  54. if e.word == nil {
  55. iter.ReportError("ReadVal", "can not read into nil pointer")
  56. return
  57. }
  58. decoder.Decode(e.word, iter)
  59. }
  60. // WriteVal copy the go interface into underlying JSON, same as json.Marshal
  61. func (stream *Stream) WriteVal(val interface{}) {
  62. if nil == val {
  63. stream.WriteNil()
  64. return
  65. }
  66. typ := reflect.TypeOf(val)
  67. encoder := stream.cfg.EncoderOf(typ)
  68. encoder.Encode(reflect2.PtrOf(val), stream)
  69. }
  70. func (cfg *frozenConfig) DecoderOf(typ reflect.Type) ValDecoder {
  71. cacheKey := typ
  72. decoder := cfg.getDecoderFromCache(cacheKey)
  73. if decoder != nil {
  74. return decoder
  75. }
  76. decoder = decoderOfType(cfg, "", typ)
  77. cfg.addDecoderToCache(cacheKey, decoder)
  78. return decoder
  79. }
  80. func decoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) ValDecoder {
  81. decoder := getTypeDecoderFromExtension(cfg, typ)
  82. if decoder != nil {
  83. return decoder
  84. }
  85. decoder = createDecoderOfType(cfg, prefix, typ)
  86. for _, extension := range extensions {
  87. decoder = extension.DecorateDecoder(typ, decoder)
  88. }
  89. for _, extension := range cfg.extensions {
  90. decoder = extension.DecorateDecoder(typ, decoder)
  91. }
  92. return decoder
  93. }
  94. func createDecoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) ValDecoder {
  95. decoder := createDecoderOfJsonRawMessage(cfg, prefix, typ)
  96. if decoder != nil {
  97. return decoder
  98. }
  99. decoder = createDecoderOfJsonNumber(cfg, prefix, typ)
  100. if decoder != nil {
  101. return decoder
  102. }
  103. decoder = createDecoderOfMarshaler(cfg, prefix, typ)
  104. if decoder != nil {
  105. return decoder
  106. }
  107. decoder = createDecoderOfAny(cfg, prefix, typ)
  108. if decoder != nil {
  109. return decoder
  110. }
  111. decoder = createDecoderOfNative(cfg, prefix, typ)
  112. if decoder != nil {
  113. return decoder
  114. }
  115. switch typ.Kind() {
  116. case reflect.Interface:
  117. if typ.NumMethod() == 0 {
  118. return &emptyInterfaceCodec{}
  119. }
  120. return &nonEmptyInterfaceCodec{}
  121. case reflect.Struct:
  122. return decoderOfStruct(cfg, prefix, typ)
  123. case reflect.Array:
  124. return decoderOfArray(cfg, prefix, typ)
  125. case reflect.Slice:
  126. return decoderOfSlice(cfg, prefix, typ)
  127. case reflect.Map:
  128. return decoderOfMap(cfg, prefix, typ)
  129. case reflect.Ptr:
  130. return decoderOfOptional(cfg, prefix, typ)
  131. default:
  132. return &lazyErrorDecoder{err: fmt.Errorf("%s%s is unsupported type", prefix, typ.String())}
  133. }
  134. }
  135. func (cfg *frozenConfig) EncoderOf(typ reflect.Type) ValEncoder {
  136. cacheKey := typ
  137. encoder := cfg.getEncoderFromCache(cacheKey)
  138. if encoder != nil {
  139. return encoder
  140. }
  141. encoder = encoderOfType(cfg, "", typ)
  142. if shouldFixOnePtr(typ) {
  143. encoder = &onePtrEncoder{encoder}
  144. }
  145. cfg.addEncoderToCache(cacheKey, encoder)
  146. return encoder
  147. }
  148. type onePtrEncoder struct {
  149. encoder ValEncoder
  150. }
  151. func (encoder *onePtrEncoder) IsEmpty(ptr unsafe.Pointer) bool {
  152. return encoder.encoder.IsEmpty(unsafe.Pointer(&ptr))
  153. }
  154. func (encoder *onePtrEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
  155. encoder.encoder.Encode(unsafe.Pointer(&ptr), stream)
  156. }
  157. func shouldFixOnePtr(typ reflect.Type) bool {
  158. if isPtrKind(typ.Kind()) {
  159. return true
  160. }
  161. if typ.Kind() == reflect.Struct {
  162. if typ.NumField() != 1 {
  163. return false
  164. }
  165. return shouldFixOnePtr(typ.Field(0).Type)
  166. }
  167. if typ.Kind() == reflect.Array {
  168. if typ.Len() != 1 {
  169. return false
  170. }
  171. return shouldFixOnePtr(typ.Elem())
  172. }
  173. return false
  174. }
  175. func isPtrKind(kind reflect.Kind) bool {
  176. switch kind {
  177. case reflect.Ptr, reflect.Map, reflect.Chan, reflect.Func:
  178. return true
  179. }
  180. return false
  181. }
  182. func encoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) ValEncoder {
  183. encoder := getTypeEncoderFromExtension(cfg, typ)
  184. if encoder != nil {
  185. return encoder
  186. }
  187. encoder = createEncoderOfType(cfg, prefix, typ)
  188. for _, extension := range extensions {
  189. encoder = extension.DecorateEncoder(typ, encoder)
  190. }
  191. for _, extension := range cfg.extensions {
  192. encoder = extension.DecorateEncoder(typ, encoder)
  193. }
  194. return encoder
  195. }
  196. func createEncoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) ValEncoder {
  197. encoder := createEncoderOfJsonRawMessage(cfg, prefix, typ)
  198. if encoder != nil {
  199. return encoder
  200. }
  201. encoder = createEncoderOfJsonNumber(cfg, prefix, typ)
  202. if encoder != nil {
  203. return encoder
  204. }
  205. encoder = createEncoderOfMarshaler(cfg, prefix, typ)
  206. if encoder != nil {
  207. return encoder
  208. }
  209. encoder = createEncoderOfAny(cfg, prefix, typ)
  210. if encoder != nil {
  211. return encoder
  212. }
  213. encoder = createEncoderOfNative(cfg, prefix, typ)
  214. if encoder != nil {
  215. return encoder
  216. }
  217. kind := typ.Kind()
  218. switch kind {
  219. case reflect.Interface:
  220. return &dynamicEncoder{reflect2.Type2(typ)}
  221. case reflect.Struct:
  222. return encoderOfStruct(cfg, prefix, typ)
  223. case reflect.Array:
  224. return encoderOfArray(cfg, prefix, typ)
  225. case reflect.Slice:
  226. return encoderOfSlice(cfg, prefix, typ)
  227. case reflect.Map:
  228. return encoderOfMap(cfg, prefix, typ)
  229. case reflect.Ptr:
  230. return encoderOfOptional(cfg, prefix, typ)
  231. default:
  232. return &lazyErrorEncoder{err: fmt.Errorf("%s%s is unsupported type", prefix, typ.String())}
  233. }
  234. }
  235. func createCheckIsEmpty(cfg *frozenConfig, typ reflect.Type) checkIsEmpty {
  236. kind := typ.Kind()
  237. switch kind {
  238. case reflect.String:
  239. return &stringCodec{}
  240. case reflect.Int:
  241. return &intCodec{}
  242. case reflect.Int8:
  243. return &int8Codec{}
  244. case reflect.Int16:
  245. return &int16Codec{}
  246. case reflect.Int32:
  247. return &int32Codec{}
  248. case reflect.Int64:
  249. return &int64Codec{}
  250. case reflect.Uint:
  251. return &uintCodec{}
  252. case reflect.Uint8:
  253. return &uint8Codec{}
  254. case reflect.Uint16:
  255. return &uint16Codec{}
  256. case reflect.Uint32:
  257. return &uint32Codec{}
  258. case reflect.Uintptr:
  259. return &uintptrCodec{}
  260. case reflect.Uint64:
  261. return &uint64Codec{}
  262. case reflect.Float32:
  263. return &float32Codec{}
  264. case reflect.Float64:
  265. return &float64Codec{}
  266. case reflect.Bool:
  267. return &boolCodec{}
  268. case reflect.Interface:
  269. return &dynamicEncoder{reflect2.Type2(typ)}
  270. case reflect.Struct:
  271. return &structEncoder{typ: typ}
  272. case reflect.Array:
  273. return &arrayEncoder{}
  274. case reflect.Slice:
  275. return &sliceEncoder{}
  276. case reflect.Map:
  277. return encoderOfMap(cfg, "", typ)
  278. case reflect.Ptr:
  279. return &OptionalEncoder{}
  280. default:
  281. return &lazyErrorEncoder{err: fmt.Errorf("unsupported type: %v", typ)}
  282. }
  283. }
  284. type placeholderDecoder struct {
  285. cfg *frozenConfig
  286. cacheKey reflect.Type
  287. }
  288. func (decoder *placeholderDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  289. for i := 0; i < 500; i++ {
  290. realDecoder := decoder.cfg.getDecoderFromCache(decoder.cacheKey)
  291. _, isPlaceholder := realDecoder.(*placeholderDecoder)
  292. if isPlaceholder {
  293. time.Sleep(10 * time.Millisecond)
  294. } else {
  295. realDecoder.Decode(ptr, iter)
  296. return
  297. }
  298. }
  299. panic(fmt.Sprintf("real decoder not found for cache key: %v", decoder.cacheKey))
  300. }
  301. type lazyErrorDecoder struct {
  302. err error
  303. }
  304. func (decoder *lazyErrorDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  305. if iter.WhatIsNext() != NilValue {
  306. if iter.Error == nil {
  307. iter.Error = decoder.err
  308. }
  309. } else {
  310. iter.Skip()
  311. }
  312. }
  313. type lazyErrorEncoder struct {
  314. err error
  315. }
  316. func (encoder *lazyErrorEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
  317. if ptr == nil {
  318. stream.WriteNil()
  319. } else if stream.Error == nil {
  320. stream.Error = encoder.err
  321. }
  322. }
  323. func (encoder *lazyErrorEncoder) IsEmpty(ptr unsafe.Pointer) bool {
  324. return false
  325. }
  326. func extractInterface(val interface{}) emptyInterface {
  327. return *((*emptyInterface)(unsafe.Pointer(&val)))
  328. }
  329. // emptyInterface is the header for an interface{} value.
  330. type emptyInterface struct {
  331. typ unsafe.Pointer
  332. word unsafe.Pointer
  333. }
  334. // emptyInterface is the header for an interface with method (not interface{})
  335. type nonEmptyInterface struct {
  336. // see ../runtime/iface.go:/Itab
  337. itab *struct {
  338. ityp unsafe.Pointer // static interface type
  339. typ unsafe.Pointer // dynamic concrete type
  340. link unsafe.Pointer
  341. bad int32
  342. unused int32
  343. fun [100000]unsafe.Pointer // method table
  344. }
  345. word unsafe.Pointer
  346. }