reflect.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551
  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 jsonNumberType reflect.Type
  35. var jsoniterNumberType reflect.Type
  36. var jsonRawMessageType reflect.Type
  37. var jsoniterRawMessageType reflect.Type
  38. var anyType reflect.Type
  39. var marshalerType reflect.Type
  40. var unmarshalerType reflect.Type
  41. var textMarshalerType reflect.Type
  42. var textUnmarshalerType reflect.Type
  43. func init() {
  44. jsonNumberType = reflect.TypeOf((*json.Number)(nil)).Elem()
  45. jsoniterNumberType = reflect.TypeOf((*Number)(nil)).Elem()
  46. jsonRawMessageType = reflect.TypeOf((*json.RawMessage)(nil)).Elem()
  47. jsoniterRawMessageType = reflect.TypeOf((*RawMessage)(nil)).Elem()
  48. anyType = reflect.TypeOf((*Any)(nil)).Elem()
  49. marshalerType = reflect.TypeOf((*json.Marshaler)(nil)).Elem()
  50. unmarshalerType = reflect.TypeOf((*json.Unmarshaler)(nil)).Elem()
  51. textMarshalerType = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem()
  52. textUnmarshalerType = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem()
  53. }
  54. // ReadVal copy the underlying JSON into go interface, same as json.Unmarshal
  55. func (iter *Iterator) ReadVal(obj interface{}) {
  56. typ := reflect.TypeOf(obj)
  57. cacheKey := typ.Elem()
  58. decoder := decoderOfType(iter.cfg, "", cacheKey)
  59. e := (*emptyInterface)(unsafe.Pointer(&obj))
  60. if e.word == nil {
  61. iter.ReportError("ReadVal", "can not read into nil pointer")
  62. return
  63. }
  64. decoder.Decode(e.word, iter)
  65. }
  66. // WriteVal copy the go interface into underlying JSON, same as json.Marshal
  67. func (stream *Stream) WriteVal(val interface{}) {
  68. if nil == val {
  69. stream.WriteNil()
  70. return
  71. }
  72. typ := reflect.TypeOf(val)
  73. encoder := stream.cfg.EncoderOf(typ)
  74. encoder.Encode(reflect2.PtrOf(val), stream)
  75. }
  76. func (cfg *frozenConfig) DecoderOf(typ reflect.Type) ValDecoder {
  77. cacheKey := typ
  78. decoder := cfg.getDecoderFromCache(cacheKey)
  79. if decoder != nil {
  80. return decoder
  81. }
  82. decoder = decoderOfType(cfg, "", typ)
  83. cfg.addDecoderToCache(cacheKey, decoder)
  84. return decoder
  85. }
  86. func decoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) ValDecoder {
  87. decoder := getTypeDecoderFromExtension(cfg, typ)
  88. if decoder != nil {
  89. return decoder
  90. }
  91. decoder = createDecoderOfType(cfg, prefix, typ)
  92. for _, extension := range extensions {
  93. decoder = extension.DecorateDecoder(typ, decoder)
  94. }
  95. for _, extension := range cfg.extensions {
  96. decoder = extension.DecorateDecoder(typ, decoder)
  97. }
  98. return decoder
  99. }
  100. func createDecoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) ValDecoder {
  101. typeName := typ.String()
  102. if typ == jsonRawMessageType {
  103. return &jsonRawMessageCodec{}
  104. }
  105. if typ == jsoniterRawMessageType {
  106. return &jsoniterRawMessageCodec{}
  107. }
  108. if typ.AssignableTo(jsonNumberType) {
  109. return &jsonNumberCodec{}
  110. }
  111. if typ.AssignableTo(jsoniterNumberType) {
  112. return &jsoniterNumberCodec{}
  113. }
  114. decoder := createDecoderOfMarshaler(cfg, prefix, typ)
  115. if decoder != nil {
  116. return decoder
  117. }
  118. if typ.Kind() == reflect.Slice && typ.Elem().Kind() == reflect.Uint8 {
  119. sliceDecoder := decoderOfSlice(cfg, prefix, typ)
  120. return &base64Codec{sliceDecoder: sliceDecoder}
  121. }
  122. if typ == anyType {
  123. return &directAnyCodec{}
  124. }
  125. if typ.Implements(anyType) {
  126. return &anyCodec{}
  127. }
  128. switch typ.Kind() {
  129. case reflect.String:
  130. if typeName != "string" {
  131. return decoderOfType(cfg, prefix, reflect.TypeOf((*string)(nil)).Elem())
  132. }
  133. return &stringCodec{}
  134. case reflect.Int:
  135. if typeName != "int" {
  136. return decoderOfType(cfg, prefix, reflect.TypeOf((*int)(nil)).Elem())
  137. }
  138. return &intCodec{}
  139. case reflect.Int8:
  140. if typeName != "int8" {
  141. return decoderOfType(cfg, prefix, reflect.TypeOf((*int8)(nil)).Elem())
  142. }
  143. return &int8Codec{}
  144. case reflect.Int16:
  145. if typeName != "int16" {
  146. return decoderOfType(cfg, prefix, reflect.TypeOf((*int16)(nil)).Elem())
  147. }
  148. return &int16Codec{}
  149. case reflect.Int32:
  150. if typeName != "int32" {
  151. return decoderOfType(cfg, prefix, reflect.TypeOf((*int32)(nil)).Elem())
  152. }
  153. return &int32Codec{}
  154. case reflect.Int64:
  155. if typeName != "int64" {
  156. return decoderOfType(cfg, prefix, reflect.TypeOf((*int64)(nil)).Elem())
  157. }
  158. return &int64Codec{}
  159. case reflect.Uint:
  160. if typeName != "uint" {
  161. return decoderOfType(cfg, prefix, reflect.TypeOf((*uint)(nil)).Elem())
  162. }
  163. return &uintCodec{}
  164. case reflect.Uint8:
  165. if typeName != "uint8" {
  166. return decoderOfType(cfg, prefix, reflect.TypeOf((*uint8)(nil)).Elem())
  167. }
  168. return &uint8Codec{}
  169. case reflect.Uint16:
  170. if typeName != "uint16" {
  171. return decoderOfType(cfg, prefix, reflect.TypeOf((*uint16)(nil)).Elem())
  172. }
  173. return &uint16Codec{}
  174. case reflect.Uint32:
  175. if typeName != "uint32" {
  176. return decoderOfType(cfg, prefix, reflect.TypeOf((*uint32)(nil)).Elem())
  177. }
  178. return &uint32Codec{}
  179. case reflect.Uintptr:
  180. if typeName != "uintptr" {
  181. return decoderOfType(cfg, prefix, reflect.TypeOf((*uintptr)(nil)).Elem())
  182. }
  183. return &uintptrCodec{}
  184. case reflect.Uint64:
  185. if typeName != "uint64" {
  186. return decoderOfType(cfg, prefix, reflect.TypeOf((*uint64)(nil)).Elem())
  187. }
  188. return &uint64Codec{}
  189. case reflect.Float32:
  190. if typeName != "float32" {
  191. return decoderOfType(cfg, prefix, reflect.TypeOf((*float32)(nil)).Elem())
  192. }
  193. return &float32Codec{}
  194. case reflect.Float64:
  195. if typeName != "float64" {
  196. return decoderOfType(cfg, prefix, reflect.TypeOf((*float64)(nil)).Elem())
  197. }
  198. return &float64Codec{}
  199. case reflect.Bool:
  200. if typeName != "bool" {
  201. return decoderOfType(cfg, prefix, reflect.TypeOf((*bool)(nil)).Elem())
  202. }
  203. return &boolCodec{}
  204. case reflect.Interface:
  205. if typ.NumMethod() == 0 {
  206. return &emptyInterfaceCodec{}
  207. }
  208. return &nonEmptyInterfaceCodec{}
  209. case reflect.Struct:
  210. return decoderOfStruct(cfg, prefix, typ)
  211. case reflect.Array:
  212. return decoderOfArray(cfg, prefix, typ)
  213. case reflect.Slice:
  214. return decoderOfSlice(cfg, prefix, typ)
  215. case reflect.Map:
  216. return decoderOfMap(cfg, prefix, typ)
  217. case reflect.Ptr:
  218. return decoderOfOptional(cfg, prefix, typ)
  219. default:
  220. return &lazyErrorDecoder{err: fmt.Errorf("%s%s is unsupported type", prefix, typ.String())}
  221. }
  222. }
  223. func (cfg *frozenConfig) EncoderOf(typ reflect.Type) ValEncoder {
  224. cacheKey := typ
  225. encoder := cfg.getEncoderFromCache(cacheKey)
  226. if encoder != nil {
  227. return encoder
  228. }
  229. encoder = encoderOfType(cfg, "", typ)
  230. if shouldFixOnePtr(typ) {
  231. encoder = &onePtrEncoder{encoder}
  232. }
  233. cfg.addEncoderToCache(cacheKey, encoder)
  234. return encoder
  235. }
  236. type onePtrEncoder struct {
  237. encoder ValEncoder
  238. }
  239. func (encoder *onePtrEncoder) IsEmpty(ptr unsafe.Pointer) bool {
  240. return encoder.encoder.IsEmpty(unsafe.Pointer(&ptr))
  241. }
  242. func (encoder *onePtrEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
  243. encoder.encoder.Encode(unsafe.Pointer(&ptr), stream)
  244. }
  245. func shouldFixOnePtr(typ reflect.Type) bool {
  246. if isPtrKind(typ.Kind()) {
  247. return true
  248. }
  249. if typ.Kind() == reflect.Struct {
  250. if typ.NumField() != 1 {
  251. return false
  252. }
  253. return shouldFixOnePtr(typ.Field(0).Type)
  254. }
  255. if typ.Kind() == reflect.Array {
  256. if typ.Len() != 1 {
  257. return false
  258. }
  259. return shouldFixOnePtr(typ.Elem())
  260. }
  261. return false
  262. }
  263. func isPtrKind(kind reflect.Kind) bool {
  264. switch kind {
  265. case reflect.Ptr, reflect.Map, reflect.Chan, reflect.Func:
  266. return true
  267. }
  268. return false
  269. }
  270. func encoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) ValEncoder {
  271. encoder := getTypeEncoderFromExtension(cfg, typ)
  272. if encoder != nil {
  273. return encoder
  274. }
  275. encoder = createEncoderOfType(cfg, prefix, typ)
  276. for _, extension := range extensions {
  277. encoder = extension.DecorateEncoder(typ, encoder)
  278. }
  279. for _, extension := range cfg.extensions {
  280. encoder = extension.DecorateEncoder(typ, encoder)
  281. }
  282. return encoder
  283. }
  284. func createEncoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) ValEncoder {
  285. if typ == jsonRawMessageType {
  286. return &jsonRawMessageCodec{}
  287. }
  288. if typ == jsoniterRawMessageType {
  289. return &jsoniterRawMessageCodec{}
  290. }
  291. if typ.AssignableTo(jsonNumberType) {
  292. return &jsonNumberCodec{}
  293. }
  294. if typ.AssignableTo(jsoniterNumberType) {
  295. return &jsoniterNumberCodec{}
  296. }
  297. encoder := createEncoderOfMarshaler(cfg, prefix, typ)
  298. if encoder != nil {
  299. return encoder
  300. }
  301. if typ.Kind() == reflect.Slice && typ.Elem().Kind() == reflect.Uint8 {
  302. return &base64Codec{}
  303. }
  304. if typ == anyType {
  305. return &directAnyCodec{}
  306. }
  307. if typ.Implements(anyType) {
  308. return &anyCodec{
  309. valType: reflect2.Type2(typ),
  310. }
  311. }
  312. return createEncoderOfSimpleType(cfg, prefix, typ)
  313. }
  314. func createCheckIsEmpty(cfg *frozenConfig, typ reflect.Type) checkIsEmpty {
  315. kind := typ.Kind()
  316. switch kind {
  317. case reflect.String:
  318. return &stringCodec{}
  319. case reflect.Int:
  320. return &intCodec{}
  321. case reflect.Int8:
  322. return &int8Codec{}
  323. case reflect.Int16:
  324. return &int16Codec{}
  325. case reflect.Int32:
  326. return &int32Codec{}
  327. case reflect.Int64:
  328. return &int64Codec{}
  329. case reflect.Uint:
  330. return &uintCodec{}
  331. case reflect.Uint8:
  332. return &uint8Codec{}
  333. case reflect.Uint16:
  334. return &uint16Codec{}
  335. case reflect.Uint32:
  336. return &uint32Codec{}
  337. case reflect.Uintptr:
  338. return &uintptrCodec{}
  339. case reflect.Uint64:
  340. return &uint64Codec{}
  341. case reflect.Float32:
  342. return &float32Codec{}
  343. case reflect.Float64:
  344. return &float64Codec{}
  345. case reflect.Bool:
  346. return &boolCodec{}
  347. case reflect.Interface:
  348. return &dynamicEncoder{reflect2.Type2(typ)}
  349. case reflect.Struct:
  350. return &structEncoder{typ: typ}
  351. case reflect.Array:
  352. return &arrayEncoder{}
  353. case reflect.Slice:
  354. return &sliceEncoder{}
  355. case reflect.Map:
  356. return encoderOfMap(cfg, "", typ)
  357. case reflect.Ptr:
  358. return &OptionalEncoder{}
  359. default:
  360. return &lazyErrorEncoder{err: fmt.Errorf("unsupported type: %v", typ)}
  361. }
  362. }
  363. func createEncoderOfSimpleType(cfg *frozenConfig, prefix string, typ reflect.Type) ValEncoder {
  364. typeName := typ.String()
  365. kind := typ.Kind()
  366. switch kind {
  367. case reflect.String:
  368. if typeName != "string" {
  369. return encoderOfType(cfg, prefix, reflect.TypeOf((*string)(nil)).Elem())
  370. }
  371. return &stringCodec{}
  372. case reflect.Int:
  373. if typeName != "int" {
  374. return encoderOfType(cfg, prefix, reflect.TypeOf((*int)(nil)).Elem())
  375. }
  376. return &intCodec{}
  377. case reflect.Int8:
  378. if typeName != "int8" {
  379. return encoderOfType(cfg, prefix, reflect.TypeOf((*int8)(nil)).Elem())
  380. }
  381. return &int8Codec{}
  382. case reflect.Int16:
  383. if typeName != "int16" {
  384. return encoderOfType(cfg, prefix, reflect.TypeOf((*int16)(nil)).Elem())
  385. }
  386. return &int16Codec{}
  387. case reflect.Int32:
  388. if typeName != "int32" {
  389. return encoderOfType(cfg, prefix, reflect.TypeOf((*int32)(nil)).Elem())
  390. }
  391. return &int32Codec{}
  392. case reflect.Int64:
  393. if typeName != "int64" {
  394. return encoderOfType(cfg, prefix, reflect.TypeOf((*int64)(nil)).Elem())
  395. }
  396. return &int64Codec{}
  397. case reflect.Uint:
  398. if typeName != "uint" {
  399. return encoderOfType(cfg, prefix, reflect.TypeOf((*uint)(nil)).Elem())
  400. }
  401. return &uintCodec{}
  402. case reflect.Uint8:
  403. if typeName != "uint8" {
  404. return encoderOfType(cfg, prefix, reflect.TypeOf((*uint8)(nil)).Elem())
  405. }
  406. return &uint8Codec{}
  407. case reflect.Uint16:
  408. if typeName != "uint16" {
  409. return encoderOfType(cfg, prefix, reflect.TypeOf((*uint16)(nil)).Elem())
  410. }
  411. return &uint16Codec{}
  412. case reflect.Uint32:
  413. if typeName != "uint32" {
  414. return encoderOfType(cfg, prefix, reflect.TypeOf((*uint32)(nil)).Elem())
  415. }
  416. return &uint32Codec{}
  417. case reflect.Uintptr:
  418. if typeName != "uintptr" {
  419. return encoderOfType(cfg, prefix, reflect.TypeOf((*uintptr)(nil)).Elem())
  420. }
  421. return &uintptrCodec{}
  422. case reflect.Uint64:
  423. if typeName != "uint64" {
  424. return encoderOfType(cfg, prefix, reflect.TypeOf((*uint64)(nil)).Elem())
  425. }
  426. return &uint64Codec{}
  427. case reflect.Float32:
  428. if typeName != "float32" {
  429. return encoderOfType(cfg, prefix, reflect.TypeOf((*float32)(nil)).Elem())
  430. }
  431. return &float32Codec{}
  432. case reflect.Float64:
  433. if typeName != "float64" {
  434. return encoderOfType(cfg, prefix, reflect.TypeOf((*float64)(nil)).Elem())
  435. }
  436. return &float64Codec{}
  437. case reflect.Bool:
  438. if typeName != "bool" {
  439. return encoderOfType(cfg, prefix, reflect.TypeOf((*bool)(nil)).Elem())
  440. }
  441. return &boolCodec{}
  442. case reflect.Interface:
  443. return &dynamicEncoder{reflect2.Type2(typ)}
  444. case reflect.Struct:
  445. return encoderOfStruct(cfg, prefix, typ)
  446. case reflect.Array:
  447. return encoderOfArray(cfg, prefix, typ)
  448. case reflect.Slice:
  449. return encoderOfSlice(cfg, prefix, typ)
  450. case reflect.Map:
  451. return encoderOfMap(cfg, prefix, typ)
  452. case reflect.Ptr:
  453. return encoderOfOptional(cfg, prefix, typ)
  454. default:
  455. return &lazyErrorEncoder{err: fmt.Errorf("%s%s is unsupported type", prefix, typ.String())}
  456. }
  457. }
  458. type placeholderDecoder struct {
  459. cfg *frozenConfig
  460. cacheKey reflect.Type
  461. }
  462. func (decoder *placeholderDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  463. for i := 0; i < 500; i++ {
  464. realDecoder := decoder.cfg.getDecoderFromCache(decoder.cacheKey)
  465. _, isPlaceholder := realDecoder.(*placeholderDecoder)
  466. if isPlaceholder {
  467. time.Sleep(10 * time.Millisecond)
  468. } else {
  469. realDecoder.Decode(ptr, iter)
  470. return
  471. }
  472. }
  473. panic(fmt.Sprintf("real decoder not found for cache key: %v", decoder.cacheKey))
  474. }
  475. type lazyErrorDecoder struct {
  476. err error
  477. }
  478. func (decoder *lazyErrorDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  479. if iter.WhatIsNext() != NilValue {
  480. if iter.Error == nil {
  481. iter.Error = decoder.err
  482. }
  483. } else {
  484. iter.Skip()
  485. }
  486. }
  487. type lazyErrorEncoder struct {
  488. err error
  489. }
  490. func (encoder *lazyErrorEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
  491. if ptr == nil {
  492. stream.WriteNil()
  493. } else if stream.Error == nil {
  494. stream.Error = encoder.err
  495. }
  496. }
  497. func (encoder *lazyErrorEncoder) IsEmpty(ptr unsafe.Pointer) bool {
  498. return false
  499. }
  500. func extractInterface(val interface{}) emptyInterface {
  501. return *((*emptyInterface)(unsafe.Pointer(&val)))
  502. }
  503. // emptyInterface is the header for an interface{} value.
  504. type emptyInterface struct {
  505. typ unsafe.Pointer
  506. word unsafe.Pointer
  507. }
  508. // emptyInterface is the header for an interface with method (not interface{})
  509. type nonEmptyInterface struct {
  510. // see ../runtime/iface.go:/Itab
  511. itab *struct {
  512. ityp unsafe.Pointer // static interface type
  513. typ unsafe.Pointer // dynamic concrete type
  514. link unsafe.Pointer
  515. bad int32
  516. unused int32
  517. fun [100000]unsafe.Pointer // method table
  518. }
  519. word unsafe.Pointer
  520. }