reflect_map.go 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. package jsoniter
  2. import (
  3. "fmt"
  4. "github.com/modern-go/reflect2"
  5. "io"
  6. "reflect"
  7. "sort"
  8. "unsafe"
  9. )
  10. func decoderOfMap(ctx *ctx, typ reflect2.Type) ValDecoder {
  11. mapType := typ.(*reflect2.UnsafeMapType)
  12. keyDecoder := decoderOfMapKey(ctx.append("[mapKey]"), mapType.Key())
  13. elemDecoder := decoderOfType(ctx.append("[mapElem]"), mapType.Elem())
  14. return &mapDecoder{
  15. mapType: mapType,
  16. keyType: mapType.Key(),
  17. elemType: mapType.Elem(),
  18. keyDecoder: keyDecoder,
  19. elemDecoder: elemDecoder,
  20. }
  21. }
  22. func encoderOfMap(ctx *ctx, typ reflect2.Type) ValEncoder {
  23. mapType := typ.(*reflect2.UnsafeMapType)
  24. if ctx.sortMapKeys {
  25. return &sortKeysMapEncoder{
  26. mapType: mapType,
  27. keyEncoder: encoderOfMapKey(ctx.append("[mapKey]"), mapType.Key()),
  28. elemEncoder: encoderOfType(ctx.append("[mapElem]"), mapType.Elem()),
  29. }
  30. }
  31. return &mapEncoder{
  32. mapType: mapType,
  33. keyEncoder: encoderOfMapKey(ctx.append("[mapKey]"), mapType.Key()),
  34. elemEncoder: encoderOfType(ctx.append("[mapElem]"), mapType.Elem()),
  35. }
  36. }
  37. func decoderOfMapKey(ctx *ctx, typ reflect2.Type) ValDecoder {
  38. decoder := ctx.decoderExtension.CreateMapKeyDecoder(typ)
  39. if decoder != nil {
  40. return decoder
  41. }
  42. for _, extension := range ctx.extraExtensions {
  43. decoder := extension.CreateMapKeyDecoder(typ)
  44. if decoder != nil {
  45. return decoder
  46. }
  47. }
  48. ptrType := reflect2.PtrTo(typ)
  49. if ptrType.Implements(unmarshalerType) {
  50. return &referenceDecoder{
  51. &unmarshalerDecoder{
  52. valType: ptrType,
  53. },
  54. }
  55. }
  56. if typ.Implements(unmarshalerType) {
  57. return &unmarshalerDecoder{
  58. valType: typ,
  59. }
  60. }
  61. if ptrType.Implements(textUnmarshalerType) {
  62. return &referenceDecoder{
  63. &textUnmarshalerDecoder{
  64. valType: ptrType,
  65. },
  66. }
  67. }
  68. if typ.Implements(textUnmarshalerType) {
  69. return &textUnmarshalerDecoder{
  70. valType: typ,
  71. }
  72. }
  73. switch typ.Kind() {
  74. case reflect.String:
  75. return decoderOfType(ctx, reflect2.DefaultTypeOfKind(reflect.String))
  76. case reflect.Bool,
  77. reflect.Uint8, reflect.Int8,
  78. reflect.Uint16, reflect.Int16,
  79. reflect.Uint32, reflect.Int32,
  80. reflect.Uint64, reflect.Int64,
  81. reflect.Uint, reflect.Int,
  82. reflect.Float32, reflect.Float64,
  83. reflect.Uintptr:
  84. typ = reflect2.DefaultTypeOfKind(typ.Kind())
  85. return &numericMapKeyDecoder{decoderOfType(ctx, typ)}
  86. default:
  87. return &lazyErrorDecoder{err: fmt.Errorf("unsupported map key type: %v", typ)}
  88. }
  89. }
  90. func encoderOfMapKey(ctx *ctx, typ reflect2.Type) ValEncoder {
  91. encoder := ctx.encoderExtension.CreateMapKeyEncoder(typ)
  92. if encoder != nil {
  93. return encoder
  94. }
  95. for _, extension := range ctx.extraExtensions {
  96. encoder := extension.CreateMapKeyEncoder(typ)
  97. if encoder != nil {
  98. return encoder
  99. }
  100. }
  101. if typ == textMarshalerType {
  102. return &directTextMarshalerEncoder{
  103. stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")),
  104. }
  105. }
  106. if typ.Implements(textMarshalerType) {
  107. return &textMarshalerEncoder{
  108. valType: typ,
  109. stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")),
  110. }
  111. }
  112. switch typ.Kind() {
  113. case reflect.String:
  114. return encoderOfType(ctx, reflect2.DefaultTypeOfKind(reflect.String))
  115. case reflect.Bool,
  116. reflect.Uint8, reflect.Int8,
  117. reflect.Uint16, reflect.Int16,
  118. reflect.Uint32, reflect.Int32,
  119. reflect.Uint64, reflect.Int64,
  120. reflect.Uint, reflect.Int,
  121. reflect.Float32, reflect.Float64,
  122. reflect.Uintptr:
  123. typ = reflect2.DefaultTypeOfKind(typ.Kind())
  124. return &numericMapKeyEncoder{encoderOfType(ctx, typ)}
  125. default:
  126. if typ.Kind() == reflect.Interface {
  127. return &dynamicMapKeyEncoder{ctx, typ}
  128. }
  129. return &lazyErrorEncoder{err: fmt.Errorf("unsupported map key type: %v", typ)}
  130. }
  131. }
  132. type mapDecoder struct {
  133. mapType *reflect2.UnsafeMapType
  134. keyType reflect2.Type
  135. elemType reflect2.Type
  136. keyDecoder ValDecoder
  137. elemDecoder ValDecoder
  138. }
  139. func (decoder *mapDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  140. mapType := decoder.mapType
  141. c := iter.nextToken()
  142. if c == 'n' {
  143. iter.skipThreeBytes('u', 'l', 'l')
  144. *(*unsafe.Pointer)(ptr) = nil
  145. mapType.UnsafeSet(ptr, mapType.UnsafeNew())
  146. return
  147. }
  148. if mapType.UnsafeIsNil(ptr) {
  149. mapType.UnsafeSet(ptr, mapType.UnsafeMakeMap(0))
  150. }
  151. if c != '{' {
  152. iter.ReportError("ReadMapCB", `expect { or n, but found `+string([]byte{c}))
  153. return
  154. }
  155. c = iter.nextToken()
  156. if c == '}' {
  157. return
  158. }
  159. iter.unreadByte()
  160. key := decoder.keyType.UnsafeNew()
  161. decoder.keyDecoder.Decode(key, iter)
  162. c = iter.nextToken()
  163. if c != ':' {
  164. iter.ReportError("ReadMapCB", "expect : after object field, but found "+string([]byte{c}))
  165. return
  166. }
  167. elem := decoder.elemType.UnsafeNew()
  168. decoder.elemDecoder.Decode(elem, iter)
  169. decoder.mapType.UnsafeSetIndex(ptr, key, elem)
  170. for c = iter.nextToken(); c == ','; c = iter.nextToken() {
  171. key := decoder.keyType.UnsafeNew()
  172. decoder.keyDecoder.Decode(key, iter)
  173. c = iter.nextToken()
  174. if c != ':' {
  175. iter.ReportError("ReadMapCB", "expect : after object field, but found "+string([]byte{c}))
  176. return
  177. }
  178. elem := decoder.elemType.UnsafeNew()
  179. decoder.elemDecoder.Decode(elem, iter)
  180. decoder.mapType.UnsafeSetIndex(ptr, key, elem)
  181. }
  182. if c != '}' {
  183. iter.ReportError("ReadMapCB", `expect }, but found `+string([]byte{c}))
  184. }
  185. }
  186. type numericMapKeyDecoder struct {
  187. decoder ValDecoder
  188. }
  189. func (decoder *numericMapKeyDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
  190. c := iter.nextToken()
  191. if c != '"' {
  192. iter.ReportError("ReadMapCB", `expect ", but found `+string([]byte{c}))
  193. return
  194. }
  195. decoder.decoder.Decode(ptr, iter)
  196. c = iter.nextToken()
  197. if c != '"' {
  198. iter.ReportError("ReadMapCB", `expect ", but found `+string([]byte{c}))
  199. return
  200. }
  201. }
  202. type numericMapKeyEncoder struct {
  203. encoder ValEncoder
  204. }
  205. func (encoder *numericMapKeyEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
  206. stream.writeByte('"')
  207. encoder.encoder.Encode(ptr, stream)
  208. stream.writeByte('"')
  209. }
  210. func (encoder *numericMapKeyEncoder) IsEmpty(ptr unsafe.Pointer) bool {
  211. return false
  212. }
  213. type dynamicMapKeyEncoder struct {
  214. ctx *ctx
  215. valType reflect2.Type
  216. }
  217. func (encoder *dynamicMapKeyEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
  218. obj := encoder.valType.UnsafeIndirect(ptr)
  219. encoderOfMapKey(encoder.ctx, reflect2.TypeOf(obj)).Encode(reflect2.PtrOf(obj), stream)
  220. }
  221. func (encoder *dynamicMapKeyEncoder) IsEmpty(ptr unsafe.Pointer) bool {
  222. obj := encoder.valType.UnsafeIndirect(ptr)
  223. return encoderOfMapKey(encoder.ctx, reflect2.TypeOf(obj)).IsEmpty(reflect2.PtrOf(obj))
  224. }
  225. type mapEncoder struct {
  226. mapType *reflect2.UnsafeMapType
  227. keyEncoder ValEncoder
  228. elemEncoder ValEncoder
  229. }
  230. func (encoder *mapEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
  231. if *(*unsafe.Pointer)(ptr) == nil {
  232. stream.WriteNil()
  233. return
  234. }
  235. stream.WriteObjectStart()
  236. iter := encoder.mapType.UnsafeIterate(ptr)
  237. for i := 0; iter.HasNext(); i++ {
  238. if i != 0 {
  239. stream.WriteMore()
  240. }
  241. key, elem := iter.UnsafeNext()
  242. encoder.keyEncoder.Encode(key, stream)
  243. if stream.indention > 0 {
  244. stream.writeTwoBytes(byte(':'), byte(' '))
  245. } else {
  246. stream.writeByte(':')
  247. }
  248. encoder.elemEncoder.Encode(elem, stream)
  249. }
  250. stream.WriteObjectEnd()
  251. }
  252. func (encoder *mapEncoder) IsEmpty(ptr unsafe.Pointer) bool {
  253. iter := encoder.mapType.UnsafeIterate(ptr)
  254. return !iter.HasNext()
  255. }
  256. type sortKeysMapEncoder struct {
  257. mapType *reflect2.UnsafeMapType
  258. keyEncoder ValEncoder
  259. elemEncoder ValEncoder
  260. }
  261. func (encoder *sortKeysMapEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
  262. if *(*unsafe.Pointer)(ptr) == nil {
  263. stream.WriteNil()
  264. return
  265. }
  266. stream.WriteObjectStart()
  267. mapIter := encoder.mapType.UnsafeIterate(ptr)
  268. subStream := stream.cfg.BorrowStream(nil)
  269. subStream.Attachment = stream.Attachment
  270. subIter := stream.cfg.BorrowIterator(nil)
  271. keyValues := encodedKeyValues{}
  272. for mapIter.HasNext() {
  273. key, elem := mapIter.UnsafeNext()
  274. subStreamIndex := subStream.Buffered()
  275. encoder.keyEncoder.Encode(key, subStream)
  276. if subStream.Error != nil && subStream.Error != io.EOF && stream.Error == nil {
  277. stream.Error = subStream.Error
  278. }
  279. encodedKey := subStream.Buffer()[subStreamIndex:]
  280. subIter.ResetBytes(encodedKey)
  281. decodedKey := subIter.ReadString()
  282. if stream.indention > 0 {
  283. subStream.writeTwoBytes(byte(':'), byte(' '))
  284. } else {
  285. subStream.writeByte(':')
  286. }
  287. encoder.elemEncoder.Encode(elem, subStream)
  288. keyValues = append(keyValues, encodedKV{
  289. key: decodedKey,
  290. keyValue: subStream.Buffer()[subStreamIndex:],
  291. })
  292. }
  293. sort.Sort(keyValues)
  294. for i, keyValue := range keyValues {
  295. if i != 0 {
  296. stream.WriteMore()
  297. }
  298. stream.Write(keyValue.keyValue)
  299. }
  300. if subStream.Error != nil && stream.Error == nil {
  301. stream.Error = subStream.Error
  302. }
  303. stream.WriteObjectEnd()
  304. stream.cfg.ReturnStream(subStream)
  305. stream.cfg.ReturnIterator(subIter)
  306. }
  307. func (encoder *sortKeysMapEncoder) IsEmpty(ptr unsafe.Pointer) bool {
  308. iter := encoder.mapType.UnsafeIterate(ptr)
  309. return !iter.HasNext()
  310. }
  311. type encodedKeyValues []encodedKV
  312. type encodedKV struct {
  313. key string
  314. keyValue []byte
  315. }
  316. func (sv encodedKeyValues) Len() int { return len(sv) }
  317. func (sv encodedKeyValues) Swap(i, j int) { sv[i], sv[j] = sv[j], sv[i] }
  318. func (sv encodedKeyValues) Less(i, j int) bool { return sv[i].key < sv[j].key }