jsoniter_reflect.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609
  1. package jsoniter
  2. import (
  3. "reflect"
  4. "errors"
  5. "fmt"
  6. "unsafe"
  7. "sync/atomic"
  8. "strings"
  9. "io"
  10. )
  11. type Decoder interface {
  12. decode(ptr unsafe.Pointer, iter *Iterator)
  13. }
  14. type stringDecoder struct {
  15. }
  16. func (decoder *stringDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  17. *((*string)(ptr)) = iter.ReadString()
  18. }
  19. type intDecoder struct {
  20. }
  21. func (decoder *intDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  22. *((*int)(ptr)) = iter.ReadInt()
  23. }
  24. type int8Decoder struct {
  25. }
  26. func (decoder *int8Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  27. *((*int8)(ptr)) = iter.ReadInt8()
  28. }
  29. type int16Decoder struct {
  30. }
  31. func (decoder *int16Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  32. *((*int16)(ptr)) = iter.ReadInt16()
  33. }
  34. type int32Decoder struct {
  35. }
  36. func (decoder *int32Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  37. *((*int32)(ptr)) = iter.ReadInt32()
  38. }
  39. type int64Decoder struct {
  40. }
  41. func (decoder *int64Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  42. *((*int64)(ptr)) = iter.ReadInt64()
  43. }
  44. type uintDecoder struct {
  45. }
  46. func (decoder *uintDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  47. *((*uint)(ptr)) = iter.ReadUint()
  48. }
  49. type uint8Decoder struct {
  50. }
  51. func (decoder *uint8Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  52. *((*uint8)(ptr)) = iter.ReadUint8()
  53. }
  54. type uint16Decoder struct {
  55. }
  56. func (decoder *uint16Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  57. *((*uint16)(ptr)) = iter.ReadUint16()
  58. }
  59. type uint32Decoder struct {
  60. }
  61. func (decoder *uint32Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  62. *((*uint32)(ptr)) = iter.ReadUint32()
  63. }
  64. type uint64Decoder struct {
  65. }
  66. func (decoder *uint64Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  67. *((*uint64)(ptr)) = iter.ReadUint64()
  68. }
  69. type float32Decoder struct {
  70. }
  71. func (decoder *float32Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  72. *((*float32)(ptr)) = iter.ReadFloat32()
  73. }
  74. type float64Decoder struct {
  75. }
  76. func (decoder *float64Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  77. *((*float64)(ptr)) = iter.ReadFloat64()
  78. }
  79. type boolDecoder struct {
  80. }
  81. func (decoder *boolDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  82. *((*bool)(ptr)) = iter.ReadBool()
  83. }
  84. type stringNumberDecoder struct {
  85. elemDecoder Decoder
  86. }
  87. func (decoder *stringNumberDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  88. c := iter.readByte()
  89. if c != '"' {
  90. iter.ReportError("stringNumberDecoder", `expect "`)
  91. return
  92. }
  93. decoder.elemDecoder.decode(ptr, iter)
  94. if iter.Error != nil {
  95. return
  96. }
  97. c = iter.readByte()
  98. if c != '"' {
  99. iter.ReportError("stringNumberDecoder", `expect "`)
  100. return
  101. }
  102. }
  103. type optionalDecoder struct {
  104. valueType reflect.Type
  105. valueDecoder Decoder
  106. }
  107. func (decoder *optionalDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  108. if iter.ReadNull() {
  109. *((*unsafe.Pointer)(ptr)) = nil
  110. } else {
  111. value := reflect.New(decoder.valueType)
  112. decoder.valueDecoder.decode(unsafe.Pointer(value.Pointer()), iter)
  113. *((*uintptr)(ptr)) = value.Pointer()
  114. }
  115. }
  116. type structDecoder struct {
  117. type_ reflect.Type
  118. fields map[string]Decoder
  119. }
  120. func (decoder *structDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  121. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  122. fieldDecoder := decoder.fields[field]
  123. if fieldDecoder == nil {
  124. iter.Skip()
  125. } else {
  126. fieldDecoder.decode(ptr, iter)
  127. }
  128. }
  129. if iter.Error != nil && iter.Error != io.EOF {
  130. iter.Error = fmt.Errorf("%v: %s", decoder.type_, iter.Error.Error())
  131. }
  132. }
  133. type skipDecoder struct {
  134. type_ reflect.Type
  135. }
  136. func (decoder *skipDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  137. iter.Skip()
  138. if iter.Error != nil && iter.Error != io.EOF {
  139. iter.Error = fmt.Errorf("%v: %s", decoder.type_, iter.Error.Error())
  140. }
  141. }
  142. type oneFieldStructDecoder struct {
  143. type_ reflect.Type
  144. fieldName string
  145. fieldDecoder Decoder
  146. }
  147. func (decoder *oneFieldStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  148. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  149. if field == decoder.fieldName {
  150. decoder.fieldDecoder.decode(ptr, iter)
  151. } else {
  152. iter.Skip()
  153. }
  154. }
  155. if iter.Error != nil && iter.Error != io.EOF {
  156. iter.Error = fmt.Errorf("%v: %s", decoder.type_, iter.Error.Error())
  157. }
  158. }
  159. type twoFieldsStructDecoder struct {
  160. type_ reflect.Type
  161. fieldName1 string
  162. fieldDecoder1 Decoder
  163. fieldName2 string
  164. fieldDecoder2 Decoder
  165. }
  166. func (decoder *twoFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  167. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  168. switch field {
  169. case decoder.fieldName1:
  170. decoder.fieldDecoder1.decode(ptr, iter)
  171. case decoder.fieldName2:
  172. decoder.fieldDecoder2.decode(ptr, iter)
  173. default:
  174. iter.Skip()
  175. }
  176. }
  177. if iter.Error != nil && iter.Error != io.EOF {
  178. iter.Error = fmt.Errorf("%v: %s", decoder.type_, iter.Error.Error())
  179. }
  180. }
  181. type threeFieldsStructDecoder struct {
  182. type_ reflect.Type
  183. fieldName1 string
  184. fieldDecoder1 Decoder
  185. fieldName2 string
  186. fieldDecoder2 Decoder
  187. fieldName3 string
  188. fieldDecoder3 Decoder
  189. }
  190. func (decoder *threeFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  191. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  192. switch field {
  193. case decoder.fieldName1:
  194. decoder.fieldDecoder1.decode(ptr, iter)
  195. case decoder.fieldName2:
  196. decoder.fieldDecoder2.decode(ptr, iter)
  197. case decoder.fieldName3:
  198. decoder.fieldDecoder3.decode(ptr, iter)
  199. default:
  200. iter.Skip()
  201. }
  202. }
  203. if iter.Error != nil && iter.Error != io.EOF {
  204. iter.Error = fmt.Errorf("%v: %s", decoder.type_, iter.Error.Error())
  205. }
  206. }
  207. type fourFieldsStructDecoder struct {
  208. type_ reflect.Type
  209. fieldName1 string
  210. fieldDecoder1 Decoder
  211. fieldName2 string
  212. fieldDecoder2 Decoder
  213. fieldName3 string
  214. fieldDecoder3 Decoder
  215. fieldName4 string
  216. fieldDecoder4 Decoder
  217. }
  218. func (decoder *fourFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  219. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  220. switch field {
  221. case decoder.fieldName1:
  222. decoder.fieldDecoder1.decode(ptr, iter)
  223. case decoder.fieldName2:
  224. decoder.fieldDecoder2.decode(ptr, iter)
  225. case decoder.fieldName3:
  226. decoder.fieldDecoder3.decode(ptr, iter)
  227. case decoder.fieldName4:
  228. decoder.fieldDecoder4.decode(ptr, iter)
  229. default:
  230. iter.Skip()
  231. }
  232. }
  233. if iter.Error != nil && iter.Error != io.EOF {
  234. iter.Error = fmt.Errorf("%v: %s", decoder.type_, iter.Error.Error())
  235. }
  236. }
  237. type structFieldDecoder struct {
  238. field *reflect.StructField
  239. fieldDecoder Decoder
  240. }
  241. func (decoder *structFieldDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  242. fieldPtr := uintptr(ptr) + decoder.field.Offset
  243. decoder.fieldDecoder.decode(unsafe.Pointer(fieldPtr), iter)
  244. if iter.Error != nil && iter.Error != io.EOF {
  245. iter.Error = fmt.Errorf("%s: %s", decoder.field.Name, iter.Error.Error())
  246. }
  247. }
  248. type sliceDecoder struct {
  249. sliceType reflect.Type
  250. elemType reflect.Type
  251. elemDecoder Decoder
  252. }
  253. // sliceHeader is a safe version of SliceHeader used within this package.
  254. type sliceHeader struct {
  255. Data unsafe.Pointer
  256. Len int
  257. Cap int
  258. }
  259. func (decoder *sliceDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  260. slice := (*sliceHeader)(ptr)
  261. slice.Len = 0
  262. for iter.ReadArray() {
  263. offset := uintptr(slice.Len) * decoder.elemType.Size()
  264. growOne(slice, decoder.sliceType, decoder.elemType)
  265. dataPtr := uintptr(slice.Data) + offset
  266. decoder.elemDecoder.decode(unsafe.Pointer(dataPtr), iter)
  267. }
  268. if iter.Error != nil && iter.Error != io.EOF {
  269. iter.Error = fmt.Errorf("%v: %s", decoder.sliceType, iter.Error.Error())
  270. }
  271. }
  272. // grow grows the slice s so that it can hold extra more values, allocating
  273. // more capacity if needed. It also returns the old and new slice lengths.
  274. func growOne(slice *sliceHeader, sliceType reflect.Type, elementType reflect.Type) {
  275. newLen := slice.Len + 1
  276. if newLen <= slice.Cap {
  277. slice.Len = newLen
  278. return
  279. }
  280. newCap := slice.Cap
  281. if newCap == 0 {
  282. newCap = 1
  283. } else {
  284. for newCap < newLen {
  285. if slice.Len < 1024 {
  286. newCap += newCap
  287. } else {
  288. newCap += newCap / 4
  289. }
  290. }
  291. }
  292. dst := unsafe.Pointer(reflect.MakeSlice(sliceType, newLen, newCap).Pointer())
  293. originalBytesCount := uintptr(slice.Len) * elementType.Size()
  294. srcPtr := (*[1 << 30]byte)(slice.Data)
  295. dstPtr := (*[1 << 30]byte)(dst)
  296. for i := uintptr(0); i < originalBytesCount; i++ {
  297. dstPtr[i] = srcPtr[i]
  298. }
  299. slice.Len = newLen
  300. slice.Cap = newCap
  301. slice.Data = dst
  302. }
  303. var DECODERS unsafe.Pointer
  304. func addDecoderToCache(cacheKey string, decoder Decoder) {
  305. retry := true
  306. for retry {
  307. ptr := atomic.LoadPointer(&DECODERS)
  308. cache := *(*map[string]Decoder)(ptr)
  309. copy := map[string]Decoder{}
  310. for k, v := range cache {
  311. copy[k] = v
  312. }
  313. copy[cacheKey] = decoder
  314. retry = !atomic.CompareAndSwapPointer(&DECODERS, ptr, unsafe.Pointer(&copy))
  315. }
  316. }
  317. func getDecoderFromCache(cacheKey string) Decoder {
  318. ptr := atomic.LoadPointer(&DECODERS)
  319. cache := *(*map[string]Decoder)(ptr)
  320. return cache[cacheKey]
  321. }
  322. var typeDecoders map[string]Decoder
  323. var fieldDecoders map[string]Decoder
  324. func init() {
  325. typeDecoders = map[string]Decoder{}
  326. fieldDecoders = map[string]Decoder{}
  327. atomic.StorePointer(&DECODERS, unsafe.Pointer(&map[string]Decoder{}))
  328. }
  329. type DecoderFunc func(ptr unsafe.Pointer, iter *Iterator)
  330. type funcDecoder struct {
  331. func_ DecoderFunc
  332. }
  333. func (decoder *funcDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  334. decoder.func_(ptr, iter)
  335. }
  336. func RegisterTypeDecoder(type_ string, func_ DecoderFunc) {
  337. typeDecoders[type_] = &funcDecoder{func_}
  338. }
  339. func RegisterFieldDecoder(type_ string, field string, func_ DecoderFunc) {
  340. fieldDecoders[fmt.Sprintf("%s/%s", type_, field)] = &funcDecoder{func_}
  341. }
  342. func ClearDecoders() {
  343. typeDecoders = map[string]Decoder{}
  344. fieldDecoders = map[string]Decoder{}
  345. }
  346. // emptyInterface is the header for an interface{} value.
  347. type emptyInterface struct {
  348. typ *struct{}
  349. word unsafe.Pointer
  350. }
  351. func (iter *Iterator) Read(obj interface{}) {
  352. type_ := reflect.TypeOf(obj)
  353. cacheKey := type_.String()
  354. cachedDecoder := getDecoderFromCache(cacheKey)
  355. if cachedDecoder == nil {
  356. decoder, err := decoderOfType(type_)
  357. if err != nil {
  358. iter.Error = err
  359. return
  360. }
  361. cachedDecoder = decoder
  362. addDecoderToCache(cacheKey, decoder)
  363. }
  364. e := (*emptyInterface)(unsafe.Pointer(&obj))
  365. cachedDecoder.decode(e.word, iter)
  366. }
  367. type prefix string
  368. func (p prefix) addTo(decoder Decoder, err error) (Decoder, error) {
  369. if err != nil {
  370. return nil, fmt.Errorf("%s: %s", p, err.Error())
  371. }
  372. return decoder, err
  373. }
  374. func decoderOfType(type_ reflect.Type) (Decoder, error) {
  375. switch type_.Kind() {
  376. case reflect.Ptr:
  377. return prefix("ptr").addTo(decoderOfPtr(type_.Elem()))
  378. default:
  379. return nil, errors.New("expect ptr")
  380. }
  381. }
  382. func decoderOfPtr(type_ reflect.Type) (Decoder, error) {
  383. typeDecoder := typeDecoders[type_.String()]
  384. if typeDecoder != nil {
  385. return typeDecoder, nil
  386. }
  387. switch type_.Kind() {
  388. case reflect.String:
  389. return &stringDecoder{}, nil
  390. case reflect.Int:
  391. return &intDecoder{}, nil
  392. case reflect.Int8:
  393. return &int8Decoder{}, nil
  394. case reflect.Int16:
  395. return &int16Decoder{}, nil
  396. case reflect.Int32:
  397. return &int32Decoder{}, nil
  398. case reflect.Int64:
  399. return &int64Decoder{}, nil
  400. case reflect.Uint:
  401. return &uintDecoder{}, nil
  402. case reflect.Uint8:
  403. return &uint8Decoder{}, nil
  404. case reflect.Uint16:
  405. return &uint16Decoder{}, nil
  406. case reflect.Uint32:
  407. return &uint32Decoder{}, nil
  408. case reflect.Uint64:
  409. return &uint64Decoder{}, nil
  410. case reflect.Float32:
  411. return &float32Decoder{}, nil
  412. case reflect.Float64:
  413. return &float64Decoder{}, nil
  414. case reflect.Bool:
  415. return &boolDecoder{}, nil
  416. case reflect.Struct:
  417. return decoderOfStruct(type_)
  418. case reflect.Slice:
  419. return prefix("[slice]").addTo(decoderOfSlice(type_))
  420. case reflect.Ptr:
  421. return prefix("[optional]").addTo(decoderOfOptional(type_.Elem()))
  422. default:
  423. return nil, fmt.Errorf("unsupported type: %v", type_)
  424. }
  425. }
  426. func decoderOfOptional(type_ reflect.Type) (Decoder, error) {
  427. decoder, err := decoderOfPtr(type_)
  428. if err != nil {
  429. return nil, err
  430. }
  431. return &optionalDecoder{type_, decoder}, nil
  432. }
  433. func decoderOfStruct(type_ reflect.Type) (Decoder, error) {
  434. fields := map[string]Decoder{}
  435. for i := 0; i < type_.NumField(); i++ {
  436. field := type_.Field(i)
  437. fieldDecoderKey := fmt.Sprintf("%s/%s", type_.String(), field.Name)
  438. decoder := fieldDecoders[fieldDecoderKey]
  439. tagParts := strings.Split(field.Tag.Get("json"), ",")
  440. jsonFieldName := tagParts[0]
  441. if jsonFieldName == "" {
  442. jsonFieldName = field.Name
  443. }
  444. if decoder == nil {
  445. var err error
  446. decoder, err = decoderOfPtr(field.Type)
  447. if err != nil {
  448. return prefix(fmt.Sprintf("{%s}", field.Name)).addTo(decoder, err)
  449. }
  450. }
  451. if len(tagParts) > 1 && tagParts[1] == "string" {
  452. decoder = &stringNumberDecoder{decoder}
  453. }
  454. if jsonFieldName != "-" {
  455. fields[jsonFieldName] = &structFieldDecoder{&field, decoder}
  456. }
  457. }
  458. switch len(fields) {
  459. case 0:
  460. return &skipDecoder{type_}, nil
  461. case 1:
  462. for fieldName, fieldDecoder := range fields {
  463. return &oneFieldStructDecoder{type_, fieldName, fieldDecoder}, nil
  464. }
  465. case 2:
  466. var fieldName1 string
  467. var fieldName2 string
  468. var fieldDecoder1 Decoder
  469. var fieldDecoder2 Decoder
  470. for fieldName, fieldDecoder := range fields {
  471. if fieldName1 == "" {
  472. fieldName1 = fieldName
  473. fieldDecoder1 = fieldDecoder
  474. } else {
  475. fieldName2 = fieldName
  476. fieldDecoder2 = fieldDecoder
  477. }
  478. }
  479. return &twoFieldsStructDecoder{type_, fieldName1, fieldDecoder1, fieldName2, fieldDecoder2}, nil
  480. case 3:
  481. var fieldName1 string
  482. var fieldName2 string
  483. var fieldName3 string
  484. var fieldDecoder1 Decoder
  485. var fieldDecoder2 Decoder
  486. var fieldDecoder3 Decoder
  487. for fieldName, fieldDecoder := range fields {
  488. if fieldName1 == "" {
  489. fieldName1 = fieldName
  490. fieldDecoder1 = fieldDecoder
  491. } else if fieldName2 == "" {
  492. fieldName2 = fieldName
  493. fieldDecoder2 = fieldDecoder
  494. } else {
  495. fieldName3 = fieldName
  496. fieldDecoder3 = fieldDecoder
  497. }
  498. }
  499. return &threeFieldsStructDecoder{type_,
  500. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3}, nil
  501. case 4:
  502. var fieldName1 string
  503. var fieldName2 string
  504. var fieldName3 string
  505. var fieldName4 string
  506. var fieldDecoder1 Decoder
  507. var fieldDecoder2 Decoder
  508. var fieldDecoder3 Decoder
  509. var fieldDecoder4 Decoder
  510. for fieldName, fieldDecoder := range fields {
  511. if fieldName1 == "" {
  512. fieldName1 = fieldName
  513. fieldDecoder1 = fieldDecoder
  514. } else if fieldName2 == "" {
  515. fieldName2 = fieldName
  516. fieldDecoder2 = fieldDecoder
  517. } else if fieldName3 == "" {
  518. fieldName3 = fieldName
  519. fieldDecoder3 = fieldDecoder
  520. } else {
  521. fieldName4 = fieldName
  522. fieldDecoder4 = fieldDecoder
  523. }
  524. }
  525. return &fourFieldsStructDecoder{type_,
  526. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
  527. fieldName4, fieldDecoder4}, nil
  528. }
  529. return &structDecoder{type_, fields}, nil
  530. }
  531. func decoderOfSlice(type_ reflect.Type) (Decoder, error) {
  532. decoder, err := decoderOfPtr(type_.Elem())
  533. if err != nil {
  534. return nil, err
  535. }
  536. return &sliceDecoder{type_, type_.Elem(), decoder}, nil
  537. }