reflect.go 10 KB

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