feature_reflect_object.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. package jsoniter
  2. import (
  3. "fmt"
  4. "io"
  5. "reflect"
  6. "strings"
  7. "unsafe"
  8. )
  9. func encoderOfStruct(cfg *frozenConfig, prefix string, typ reflect.Type) ValEncoder {
  10. type bindingTo struct {
  11. binding *Binding
  12. toName string
  13. ignored bool
  14. }
  15. orderedBindings := []*bindingTo{}
  16. structDescriptor := describeStruct(cfg, prefix, typ)
  17. for _, binding := range structDescriptor.Fields {
  18. for _, toName := range binding.ToNames {
  19. new := &bindingTo{
  20. binding: binding,
  21. toName: toName,
  22. }
  23. for _, old := range orderedBindings {
  24. if old.toName != toName {
  25. continue
  26. }
  27. old.ignored, new.ignored = resolveConflictBinding(cfg, old.binding, new.binding)
  28. }
  29. orderedBindings = append(orderedBindings, new)
  30. }
  31. }
  32. if len(orderedBindings) == 0 {
  33. return &emptyStructEncoder{}
  34. }
  35. finalOrderedFields := []structFieldTo{}
  36. for _, bindingTo := range orderedBindings {
  37. if !bindingTo.ignored {
  38. finalOrderedFields = append(finalOrderedFields, structFieldTo{
  39. encoder: bindingTo.binding.Encoder.(*structFieldEncoder),
  40. toName: bindingTo.toName,
  41. })
  42. }
  43. }
  44. return &structEncoder{typ, structDescriptor.onePtrEmbedded,
  45. structDescriptor.onePtrOptimization, finalOrderedFields}
  46. }
  47. func resolveConflictBinding(cfg *frozenConfig, old, new *Binding) (ignoreOld, ignoreNew bool) {
  48. newTagged := new.Field.Tag.Get(cfg.getTagKey()) != ""
  49. oldTagged := old.Field.Tag.Get(cfg.getTagKey()) != ""
  50. if newTagged {
  51. if oldTagged {
  52. if len(old.levels) > len(new.levels) {
  53. return true, false
  54. } else if len(new.levels) > len(old.levels) {
  55. return false, true
  56. } else {
  57. return true, true
  58. }
  59. } else {
  60. return true, false
  61. }
  62. } else {
  63. if oldTagged {
  64. return true, false
  65. }
  66. if len(old.levels) > len(new.levels) {
  67. return true, false
  68. } else if len(new.levels) > len(old.levels) {
  69. return false, true
  70. } else {
  71. return true, true
  72. }
  73. }
  74. }
  75. func decoderOfStruct(cfg *frozenConfig, prefix string, typ reflect.Type) ValDecoder {
  76. bindings := map[string]*Binding{}
  77. structDescriptor := describeStruct(cfg, prefix, typ)
  78. for _, binding := range structDescriptor.Fields {
  79. for _, fromName := range binding.FromNames {
  80. old := bindings[fromName]
  81. if old == nil {
  82. bindings[fromName] = binding
  83. continue
  84. }
  85. ignoreOld, ignoreNew := resolveConflictBinding(cfg, old, binding)
  86. if ignoreOld {
  87. delete(bindings, fromName)
  88. }
  89. if !ignoreNew {
  90. bindings[fromName] = binding
  91. }
  92. }
  93. }
  94. fields := map[string]*structFieldDecoder{}
  95. for k, binding := range bindings {
  96. fields[strings.ToLower(k)] = binding.Decoder.(*structFieldDecoder)
  97. }
  98. return createStructDecoder(typ, fields)
  99. }
  100. type structFieldEncoder struct {
  101. field *reflect.StructField
  102. fieldEncoder ValEncoder
  103. omitempty bool
  104. }
  105. func (encoder *structFieldEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
  106. fieldPtr := unsafe.Pointer(uintptr(ptr) + encoder.field.Offset)
  107. encoder.fieldEncoder.Encode(fieldPtr, stream)
  108. if stream.Error != nil && stream.Error != io.EOF {
  109. stream.Error = fmt.Errorf("%s: %s", encoder.field.Name, stream.Error.Error())
  110. }
  111. }
  112. func (encoder *structFieldEncoder) EncodeInterface(val interface{}, stream *Stream) {
  113. WriteToStream(val, stream, encoder)
  114. }
  115. func (encoder *structFieldEncoder) IsEmpty(ptr unsafe.Pointer) bool {
  116. fieldPtr := unsafe.Pointer(uintptr(ptr) + encoder.field.Offset)
  117. return encoder.fieldEncoder.IsEmpty(fieldPtr)
  118. }
  119. type structEncoder struct {
  120. typ reflect.Type
  121. onePtrEmbedded bool
  122. onePtrOptimization bool
  123. fields []structFieldTo
  124. }
  125. type structFieldTo struct {
  126. encoder *structFieldEncoder
  127. toName string
  128. }
  129. func (encoder *structEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
  130. stream.WriteObjectStart()
  131. isNotFirst := false
  132. for _, field := range encoder.fields {
  133. if field.encoder.omitempty && field.encoder.IsEmpty(ptr) {
  134. continue
  135. }
  136. if isNotFirst {
  137. stream.WriteMore()
  138. }
  139. stream.WriteObjectField(field.toName)
  140. field.encoder.Encode(ptr, stream)
  141. isNotFirst = true
  142. }
  143. stream.WriteObjectEnd()
  144. if stream.Error != nil && stream.Error != io.EOF {
  145. stream.Error = fmt.Errorf("%v.%s", encoder.typ, stream.Error.Error())
  146. }
  147. }
  148. func (encoder *structEncoder) EncodeInterface(val interface{}, stream *Stream) {
  149. e := (*emptyInterface)(unsafe.Pointer(&val))
  150. if encoder.onePtrOptimization {
  151. if e.word == nil && encoder.onePtrEmbedded {
  152. stream.WriteObjectStart()
  153. stream.WriteObjectEnd()
  154. return
  155. }
  156. ptr := uintptr(e.word)
  157. e.word = unsafe.Pointer(&ptr)
  158. }
  159. if reflect.TypeOf(val).Kind() == reflect.Ptr {
  160. encoder.Encode(unsafe.Pointer(&e.word), stream)
  161. } else {
  162. encoder.Encode(e.word, stream)
  163. }
  164. }
  165. func (encoder *structEncoder) IsEmpty(ptr unsafe.Pointer) bool {
  166. return false
  167. }
  168. type emptyStructEncoder struct {
  169. }
  170. func (encoder *emptyStructEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
  171. stream.WriteEmptyObject()
  172. }
  173. func (encoder *emptyStructEncoder) EncodeInterface(val interface{}, stream *Stream) {
  174. WriteToStream(val, stream, encoder)
  175. }
  176. func (encoder *emptyStructEncoder) IsEmpty(ptr unsafe.Pointer) bool {
  177. return false
  178. }