jsoniter_reflect.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. package jsoniter
  2. import (
  3. "reflect"
  4. "errors"
  5. "fmt"
  6. "unsafe"
  7. "sync/atomic"
  8. )
  9. type Decoder interface {
  10. decode(ptr unsafe.Pointer, iter *Iterator)
  11. }
  12. type stringDecoder struct {
  13. }
  14. func (decoder *stringDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  15. *((*string)(ptr)) = iter.ReadString()
  16. }
  17. type stringOptionalDecoder struct {
  18. }
  19. func (decoder *stringOptionalDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  20. if iter.ReadNull() {
  21. *((**string)(ptr)) = nil
  22. } else {
  23. result := iter.ReadString()
  24. *((**string)(ptr)) = &result
  25. }
  26. }
  27. type structDecoder struct {
  28. fields map[string]Decoder
  29. }
  30. func (decoder *structDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  31. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  32. fieldDecoder := decoder.fields[field]
  33. if fieldDecoder == nil {
  34. iter.Skip()
  35. } else {
  36. fieldDecoder.decode(ptr, iter)
  37. }
  38. }
  39. }
  40. type structFieldDecoder struct {
  41. offset uintptr
  42. fieldDecoder Decoder
  43. }
  44. func (decoder *structFieldDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  45. fieldPtr := uintptr(ptr) + decoder.offset
  46. decoder.fieldDecoder.decode(unsafe.Pointer(fieldPtr), iter)
  47. }
  48. var DECODER_STRING *stringDecoder
  49. var DECODER_OPTIONAL_STRING *stringOptionalDecoder
  50. var DECODERS_STRUCT unsafe.Pointer
  51. func addStructDecoderToCache(cacheKey string, decoder *structDecoder) {
  52. retry := true
  53. for retry {
  54. ptr := atomic.LoadPointer(&DECODERS_STRUCT)
  55. cache := *(*map[string]*structDecoder)(ptr)
  56. copy := map[string]*structDecoder{}
  57. for k, v := range cache {
  58. copy[k] = v
  59. }
  60. copy[cacheKey] = decoder
  61. retry = !atomic.CompareAndSwapPointer(&DECODERS_STRUCT, ptr, unsafe.Pointer(&copy))
  62. }
  63. }
  64. func getStructDecoderFromCache(cacheKey string) *structDecoder {
  65. ptr := atomic.LoadPointer(&DECODERS_STRUCT)
  66. cache := *(*map[string]*structDecoder)(ptr)
  67. return cache[cacheKey]
  68. }
  69. func init() {
  70. DECODER_STRING = &stringDecoder{}
  71. DECODER_OPTIONAL_STRING = &stringOptionalDecoder{}
  72. atomic.StorePointer(&DECODERS_STRUCT, unsafe.Pointer(&map[string]*structDecoder{}))
  73. }
  74. // emptyInterface is the header for an interface{} value.
  75. type emptyInterface struct {
  76. typ *struct{}
  77. word unsafe.Pointer
  78. }
  79. func (iter *Iterator) Read(obj interface{}) {
  80. type_ := reflect.TypeOf(obj)
  81. decoder, err := decoderOfType(type_)
  82. if err != nil {
  83. iter.Error = err
  84. return
  85. }
  86. e := (*emptyInterface)(unsafe.Pointer(&obj))
  87. decoder.decode(e.word, iter)
  88. }
  89. type prefix string
  90. func (p prefix) addTo(decoder Decoder, err error) (Decoder, error) {
  91. if err != nil {
  92. return nil, fmt.Errorf("%s: %s", p, err.Error())
  93. }
  94. return decoder, err
  95. }
  96. func decoderOfType(type_ reflect.Type) (Decoder, error) {
  97. switch type_.Kind() {
  98. case reflect.Ptr:
  99. return prefix("ptr").addTo(decoderOfPtr(type_.Elem()))
  100. default:
  101. return nil, errors.New("expect ptr")
  102. }
  103. }
  104. func decoderOfPtr(type_ reflect.Type) (Decoder, error) {
  105. switch type_.Kind() {
  106. case reflect.String:
  107. return DECODER_STRING, nil
  108. case reflect.Struct:
  109. return decoderOfStruct(type_)
  110. case reflect.Slice:
  111. return decoderOfSlice(type_)
  112. case reflect.Ptr:
  113. return prefix("optional").addTo(decoderOfOptional(type_.Elem()))
  114. default:
  115. return nil, errors.New("expect string, struct, slice")
  116. }
  117. }
  118. func decoderOfOptional(type_ reflect.Type) (Decoder, error) {
  119. switch type_.Kind() {
  120. case reflect.String:
  121. return DECODER_OPTIONAL_STRING, nil
  122. default:
  123. return nil, errors.New("expect string")
  124. }
  125. }
  126. func decoderOfStruct(type_ reflect.Type) (Decoder, error) {
  127. cacheKey := type_.String()
  128. cachedDecoder := getStructDecoderFromCache(cacheKey)
  129. if cachedDecoder == nil {
  130. fields := map[string]Decoder{}
  131. for i := 0; i < type_.NumField(); i++ {
  132. field := type_.Field(i)
  133. decoder, err := decoderOfPtr(field.Type)
  134. if err != nil {
  135. return prefix(fmt.Sprintf("[%s]", field.Name)).addTo(decoder, err)
  136. }
  137. fields[field.Name] = &structFieldDecoder{field.Offset, decoder}
  138. }
  139. cachedDecoder = &structDecoder{fields}
  140. addStructDecoderToCache(cacheKey, cachedDecoder)
  141. }
  142. return cachedDecoder, nil
  143. }
  144. func decoderOfSlice(type_ reflect.Type) (Decoder, error) {
  145. fmt.Println(type_.Elem())
  146. return nil, errors.New("n/a")
  147. }