compile.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493
  1. package decoder
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "reflect"
  6. "strings"
  7. "sync"
  8. "sync/atomic"
  9. "unicode"
  10. "unsafe"
  11. "github.com/goccy/go-json/internal/runtime"
  12. )
  13. var (
  14. jsonNumberType = reflect.TypeOf(json.Number(""))
  15. typeAddr *runtime.TypeAddr
  16. cachedDecoderMap unsafe.Pointer // map[uintptr]decoder
  17. cachedDecoder []Decoder
  18. initOnce sync.Once
  19. )
  20. func initDecoder() {
  21. initOnce.Do(func() {
  22. typeAddr = runtime.AnalyzeTypeAddr()
  23. if typeAddr == nil {
  24. typeAddr = &runtime.TypeAddr{}
  25. }
  26. cachedDecoder = make([]Decoder, typeAddr.AddrRange>>typeAddr.AddrShift+1)
  27. })
  28. }
  29. func loadDecoderMap() map[uintptr]Decoder {
  30. initDecoder()
  31. p := atomic.LoadPointer(&cachedDecoderMap)
  32. return *(*map[uintptr]Decoder)(unsafe.Pointer(&p))
  33. }
  34. func storeDecoder(typ uintptr, dec Decoder, m map[uintptr]Decoder) {
  35. initDecoder()
  36. newDecoderMap := make(map[uintptr]Decoder, len(m)+1)
  37. newDecoderMap[typ] = dec
  38. for k, v := range m {
  39. newDecoderMap[k] = v
  40. }
  41. atomic.StorePointer(&cachedDecoderMap, *(*unsafe.Pointer)(unsafe.Pointer(&newDecoderMap)))
  42. }
  43. func compileToGetDecoderSlowPath(typeptr uintptr, typ *runtime.Type) (Decoder, error) {
  44. decoderMap := loadDecoderMap()
  45. if dec, exists := decoderMap[typeptr]; exists {
  46. return dec, nil
  47. }
  48. dec, err := compileHead(typ, map[uintptr]Decoder{})
  49. if err != nil {
  50. return nil, err
  51. }
  52. storeDecoder(typeptr, dec, decoderMap)
  53. return dec, nil
  54. }
  55. func compileHead(typ *runtime.Type, structTypeToDecoder map[uintptr]Decoder) (Decoder, error) {
  56. switch {
  57. case implementsUnmarshalJSONType(runtime.PtrTo(typ)):
  58. return newUnmarshalJSONDecoder(runtime.PtrTo(typ), "", ""), nil
  59. case runtime.PtrTo(typ).Implements(unmarshalTextType):
  60. return newUnmarshalTextDecoder(runtime.PtrTo(typ), "", ""), nil
  61. }
  62. return compile(typ.Elem(), "", "", structTypeToDecoder)
  63. }
  64. func compile(typ *runtime.Type, structName, fieldName string, structTypeToDecoder map[uintptr]Decoder) (Decoder, error) {
  65. switch {
  66. case implementsUnmarshalJSONType(runtime.PtrTo(typ)):
  67. return newUnmarshalJSONDecoder(runtime.PtrTo(typ), structName, fieldName), nil
  68. case runtime.PtrTo(typ).Implements(unmarshalTextType):
  69. return newUnmarshalTextDecoder(runtime.PtrTo(typ), structName, fieldName), nil
  70. }
  71. switch typ.Kind() {
  72. case reflect.Ptr:
  73. return compilePtr(typ, structName, fieldName, structTypeToDecoder)
  74. case reflect.Struct:
  75. return compileStruct(typ, structName, fieldName, structTypeToDecoder)
  76. case reflect.Slice:
  77. elem := typ.Elem()
  78. if elem.Kind() == reflect.Uint8 {
  79. return compileBytes(elem, structName, fieldName)
  80. }
  81. return compileSlice(typ, structName, fieldName, structTypeToDecoder)
  82. case reflect.Array:
  83. return compileArray(typ, structName, fieldName, structTypeToDecoder)
  84. case reflect.Map:
  85. return compileMap(typ, structName, fieldName, structTypeToDecoder)
  86. case reflect.Interface:
  87. return compileInterface(typ, structName, fieldName)
  88. case reflect.Uintptr:
  89. return compileUint(typ, structName, fieldName)
  90. case reflect.Int:
  91. return compileInt(typ, structName, fieldName)
  92. case reflect.Int8:
  93. return compileInt8(typ, structName, fieldName)
  94. case reflect.Int16:
  95. return compileInt16(typ, structName, fieldName)
  96. case reflect.Int32:
  97. return compileInt32(typ, structName, fieldName)
  98. case reflect.Int64:
  99. return compileInt64(typ, structName, fieldName)
  100. case reflect.Uint:
  101. return compileUint(typ, structName, fieldName)
  102. case reflect.Uint8:
  103. return compileUint8(typ, structName, fieldName)
  104. case reflect.Uint16:
  105. return compileUint16(typ, structName, fieldName)
  106. case reflect.Uint32:
  107. return compileUint32(typ, structName, fieldName)
  108. case reflect.Uint64:
  109. return compileUint64(typ, structName, fieldName)
  110. case reflect.String:
  111. return compileString(typ, structName, fieldName)
  112. case reflect.Bool:
  113. return compileBool(structName, fieldName)
  114. case reflect.Float32:
  115. return compileFloat32(structName, fieldName)
  116. case reflect.Float64:
  117. return compileFloat64(structName, fieldName)
  118. case reflect.Func:
  119. return compileFunc(typ, structName, fieldName)
  120. }
  121. return newInvalidDecoder(typ, structName, fieldName), nil
  122. }
  123. func isStringTagSupportedType(typ *runtime.Type) bool {
  124. switch {
  125. case implementsUnmarshalJSONType(runtime.PtrTo(typ)):
  126. return false
  127. case runtime.PtrTo(typ).Implements(unmarshalTextType):
  128. return false
  129. }
  130. switch typ.Kind() {
  131. case reflect.Map:
  132. return false
  133. case reflect.Slice:
  134. return false
  135. case reflect.Array:
  136. return false
  137. case reflect.Struct:
  138. return false
  139. case reflect.Interface:
  140. return false
  141. }
  142. return true
  143. }
  144. func compileMapKey(typ *runtime.Type, structName, fieldName string, structTypeToDecoder map[uintptr]Decoder) (Decoder, error) {
  145. if runtime.PtrTo(typ).Implements(unmarshalTextType) {
  146. return newUnmarshalTextDecoder(runtime.PtrTo(typ), structName, fieldName), nil
  147. }
  148. if typ.Kind() == reflect.String {
  149. return newStringDecoder(structName, fieldName), nil
  150. }
  151. dec, err := compile(typ, structName, fieldName, structTypeToDecoder)
  152. if err != nil {
  153. return nil, err
  154. }
  155. for {
  156. switch t := dec.(type) {
  157. case *stringDecoder, *interfaceDecoder:
  158. return dec, nil
  159. case *boolDecoder, *intDecoder, *uintDecoder, *numberDecoder:
  160. return newWrappedStringDecoder(typ, dec, structName, fieldName), nil
  161. case *ptrDecoder:
  162. dec = t.dec
  163. default:
  164. return newInvalidDecoder(typ, structName, fieldName), nil
  165. }
  166. }
  167. }
  168. func compilePtr(typ *runtime.Type, structName, fieldName string, structTypeToDecoder map[uintptr]Decoder) (Decoder, error) {
  169. dec, err := compile(typ.Elem(), structName, fieldName, structTypeToDecoder)
  170. if err != nil {
  171. return nil, err
  172. }
  173. return newPtrDecoder(dec, typ.Elem(), structName, fieldName), nil
  174. }
  175. func compileInt(typ *runtime.Type, structName, fieldName string) (Decoder, error) {
  176. return newIntDecoder(typ, structName, fieldName, func(p unsafe.Pointer, v int64) {
  177. *(*int)(p) = int(v)
  178. }), nil
  179. }
  180. func compileInt8(typ *runtime.Type, structName, fieldName string) (Decoder, error) {
  181. return newIntDecoder(typ, structName, fieldName, func(p unsafe.Pointer, v int64) {
  182. *(*int8)(p) = int8(v)
  183. }), nil
  184. }
  185. func compileInt16(typ *runtime.Type, structName, fieldName string) (Decoder, error) {
  186. return newIntDecoder(typ, structName, fieldName, func(p unsafe.Pointer, v int64) {
  187. *(*int16)(p) = int16(v)
  188. }), nil
  189. }
  190. func compileInt32(typ *runtime.Type, structName, fieldName string) (Decoder, error) {
  191. return newIntDecoder(typ, structName, fieldName, func(p unsafe.Pointer, v int64) {
  192. *(*int32)(p) = int32(v)
  193. }), nil
  194. }
  195. func compileInt64(typ *runtime.Type, structName, fieldName string) (Decoder, error) {
  196. return newIntDecoder(typ, structName, fieldName, func(p unsafe.Pointer, v int64) {
  197. *(*int64)(p) = v
  198. }), nil
  199. }
  200. func compileUint(typ *runtime.Type, structName, fieldName string) (Decoder, error) {
  201. return newUintDecoder(typ, structName, fieldName, func(p unsafe.Pointer, v uint64) {
  202. *(*uint)(p) = uint(v)
  203. }), nil
  204. }
  205. func compileUint8(typ *runtime.Type, structName, fieldName string) (Decoder, error) {
  206. return newUintDecoder(typ, structName, fieldName, func(p unsafe.Pointer, v uint64) {
  207. *(*uint8)(p) = uint8(v)
  208. }), nil
  209. }
  210. func compileUint16(typ *runtime.Type, structName, fieldName string) (Decoder, error) {
  211. return newUintDecoder(typ, structName, fieldName, func(p unsafe.Pointer, v uint64) {
  212. *(*uint16)(p) = uint16(v)
  213. }), nil
  214. }
  215. func compileUint32(typ *runtime.Type, structName, fieldName string) (Decoder, error) {
  216. return newUintDecoder(typ, structName, fieldName, func(p unsafe.Pointer, v uint64) {
  217. *(*uint32)(p) = uint32(v)
  218. }), nil
  219. }
  220. func compileUint64(typ *runtime.Type, structName, fieldName string) (Decoder, error) {
  221. return newUintDecoder(typ, structName, fieldName, func(p unsafe.Pointer, v uint64) {
  222. *(*uint64)(p) = v
  223. }), nil
  224. }
  225. func compileFloat32(structName, fieldName string) (Decoder, error) {
  226. return newFloatDecoder(structName, fieldName, func(p unsafe.Pointer, v float64) {
  227. *(*float32)(p) = float32(v)
  228. }), nil
  229. }
  230. func compileFloat64(structName, fieldName string) (Decoder, error) {
  231. return newFloatDecoder(structName, fieldName, func(p unsafe.Pointer, v float64) {
  232. *(*float64)(p) = v
  233. }), nil
  234. }
  235. func compileString(typ *runtime.Type, structName, fieldName string) (Decoder, error) {
  236. if typ == runtime.Type2RType(jsonNumberType) {
  237. return newNumberDecoder(structName, fieldName, func(p unsafe.Pointer, v json.Number) {
  238. *(*json.Number)(p) = v
  239. }), nil
  240. }
  241. return newStringDecoder(structName, fieldName), nil
  242. }
  243. func compileBool(structName, fieldName string) (Decoder, error) {
  244. return newBoolDecoder(structName, fieldName), nil
  245. }
  246. func compileBytes(typ *runtime.Type, structName, fieldName string) (Decoder, error) {
  247. return newBytesDecoder(typ, structName, fieldName), nil
  248. }
  249. func compileSlice(typ *runtime.Type, structName, fieldName string, structTypeToDecoder map[uintptr]Decoder) (Decoder, error) {
  250. elem := typ.Elem()
  251. decoder, err := compile(elem, structName, fieldName, structTypeToDecoder)
  252. if err != nil {
  253. return nil, err
  254. }
  255. return newSliceDecoder(decoder, elem, elem.Size(), structName, fieldName), nil
  256. }
  257. func compileArray(typ *runtime.Type, structName, fieldName string, structTypeToDecoder map[uintptr]Decoder) (Decoder, error) {
  258. elem := typ.Elem()
  259. decoder, err := compile(elem, structName, fieldName, structTypeToDecoder)
  260. if err != nil {
  261. return nil, err
  262. }
  263. return newArrayDecoder(decoder, elem, typ.Len(), structName, fieldName), nil
  264. }
  265. func compileMap(typ *runtime.Type, structName, fieldName string, structTypeToDecoder map[uintptr]Decoder) (Decoder, error) {
  266. keyDec, err := compileMapKey(typ.Key(), structName, fieldName, structTypeToDecoder)
  267. if err != nil {
  268. return nil, err
  269. }
  270. valueDec, err := compile(typ.Elem(), structName, fieldName, structTypeToDecoder)
  271. if err != nil {
  272. return nil, err
  273. }
  274. return newMapDecoder(typ, typ.Key(), keyDec, typ.Elem(), valueDec, structName, fieldName), nil
  275. }
  276. func compileInterface(typ *runtime.Type, structName, fieldName string) (Decoder, error) {
  277. return newInterfaceDecoder(typ, structName, fieldName), nil
  278. }
  279. func compileFunc(typ *runtime.Type, strutName, fieldName string) (Decoder, error) {
  280. return newFuncDecoder(typ, strutName, fieldName), nil
  281. }
  282. func typeToStructTags(typ *runtime.Type) runtime.StructTags {
  283. tags := runtime.StructTags{}
  284. fieldNum := typ.NumField()
  285. for i := 0; i < fieldNum; i++ {
  286. field := typ.Field(i)
  287. if runtime.IsIgnoredStructField(field) {
  288. continue
  289. }
  290. tags = append(tags, runtime.StructTagFromField(field))
  291. }
  292. return tags
  293. }
  294. func compileStruct(typ *runtime.Type, structName, fieldName string, structTypeToDecoder map[uintptr]Decoder) (Decoder, error) {
  295. fieldNum := typ.NumField()
  296. fieldMap := map[string]*structFieldSet{}
  297. typeptr := uintptr(unsafe.Pointer(typ))
  298. if dec, exists := structTypeToDecoder[typeptr]; exists {
  299. return dec, nil
  300. }
  301. structDec := newStructDecoder(structName, fieldName, fieldMap)
  302. structTypeToDecoder[typeptr] = structDec
  303. structName = typ.Name()
  304. tags := typeToStructTags(typ)
  305. allFields := []*structFieldSet{}
  306. for i := 0; i < fieldNum; i++ {
  307. field := typ.Field(i)
  308. if runtime.IsIgnoredStructField(field) {
  309. continue
  310. }
  311. isUnexportedField := unicode.IsLower([]rune(field.Name)[0])
  312. tag := runtime.StructTagFromField(field)
  313. dec, err := compile(runtime.Type2RType(field.Type), structName, field.Name, structTypeToDecoder)
  314. if err != nil {
  315. return nil, err
  316. }
  317. if field.Anonymous && !tag.IsTaggedKey {
  318. if stDec, ok := dec.(*structDecoder); ok {
  319. if runtime.Type2RType(field.Type) == typ {
  320. // recursive definition
  321. continue
  322. }
  323. for k, v := range stDec.fieldMap {
  324. if tags.ExistsKey(k) {
  325. continue
  326. }
  327. fieldSet := &structFieldSet{
  328. dec: v.dec,
  329. offset: field.Offset + v.offset,
  330. isTaggedKey: v.isTaggedKey,
  331. key: k,
  332. keyLen: int64(len(k)),
  333. }
  334. allFields = append(allFields, fieldSet)
  335. }
  336. } else if pdec, ok := dec.(*ptrDecoder); ok {
  337. contentDec := pdec.contentDecoder()
  338. if pdec.typ == typ {
  339. // recursive definition
  340. continue
  341. }
  342. var fieldSetErr error
  343. if isUnexportedField {
  344. fieldSetErr = fmt.Errorf(
  345. "json: cannot set embedded pointer to unexported struct: %v",
  346. field.Type.Elem(),
  347. )
  348. }
  349. if dec, ok := contentDec.(*structDecoder); ok {
  350. for k, v := range dec.fieldMap {
  351. if tags.ExistsKey(k) {
  352. continue
  353. }
  354. fieldSet := &structFieldSet{
  355. dec: newAnonymousFieldDecoder(pdec.typ, v.offset, v.dec),
  356. offset: field.Offset,
  357. isTaggedKey: v.isTaggedKey,
  358. key: k,
  359. keyLen: int64(len(k)),
  360. err: fieldSetErr,
  361. }
  362. allFields = append(allFields, fieldSet)
  363. }
  364. } else {
  365. fieldSet := &structFieldSet{
  366. dec: pdec,
  367. offset: field.Offset,
  368. isTaggedKey: tag.IsTaggedKey,
  369. key: field.Name,
  370. keyLen: int64(len(field.Name)),
  371. }
  372. allFields = append(allFields, fieldSet)
  373. }
  374. } else {
  375. fieldSet := &structFieldSet{
  376. dec: dec,
  377. offset: field.Offset,
  378. isTaggedKey: tag.IsTaggedKey,
  379. key: field.Name,
  380. keyLen: int64(len(field.Name)),
  381. }
  382. allFields = append(allFields, fieldSet)
  383. }
  384. } else {
  385. if tag.IsString && isStringTagSupportedType(runtime.Type2RType(field.Type)) {
  386. dec = newWrappedStringDecoder(runtime.Type2RType(field.Type), dec, structName, field.Name)
  387. }
  388. var key string
  389. if tag.Key != "" {
  390. key = tag.Key
  391. } else {
  392. key = field.Name
  393. }
  394. fieldSet := &structFieldSet{
  395. dec: dec,
  396. offset: field.Offset,
  397. isTaggedKey: tag.IsTaggedKey,
  398. key: key,
  399. keyLen: int64(len(key)),
  400. }
  401. allFields = append(allFields, fieldSet)
  402. }
  403. }
  404. for _, set := range filterDuplicatedFields(allFields) {
  405. fieldMap[set.key] = set
  406. lower := strings.ToLower(set.key)
  407. if _, exists := fieldMap[lower]; !exists {
  408. // first win
  409. fieldMap[lower] = set
  410. }
  411. }
  412. delete(structTypeToDecoder, typeptr)
  413. structDec.tryOptimize()
  414. return structDec, nil
  415. }
  416. func filterDuplicatedFields(allFields []*structFieldSet) []*structFieldSet {
  417. fieldMap := map[string][]*structFieldSet{}
  418. for _, field := range allFields {
  419. fieldMap[field.key] = append(fieldMap[field.key], field)
  420. }
  421. duplicatedFieldMap := map[string]struct{}{}
  422. for k, sets := range fieldMap {
  423. sets = filterFieldSets(sets)
  424. if len(sets) != 1 {
  425. duplicatedFieldMap[k] = struct{}{}
  426. }
  427. }
  428. filtered := make([]*structFieldSet, 0, len(allFields))
  429. for _, field := range allFields {
  430. if _, exists := duplicatedFieldMap[field.key]; exists {
  431. continue
  432. }
  433. filtered = append(filtered, field)
  434. }
  435. return filtered
  436. }
  437. func filterFieldSets(sets []*structFieldSet) []*structFieldSet {
  438. if len(sets) == 1 {
  439. return sets
  440. }
  441. filtered := make([]*structFieldSet, 0, len(sets))
  442. for _, set := range sets {
  443. if set.isTaggedKey {
  444. filtered = append(filtered, set)
  445. }
  446. }
  447. return filtered
  448. }
  449. func implementsUnmarshalJSONType(typ *runtime.Type) bool {
  450. return typ.Implements(unmarshalJSONType) || typ.Implements(unmarshalJSONContextType)
  451. }