struct.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845
  1. package decoder
  2. import (
  3. "fmt"
  4. "math"
  5. "math/bits"
  6. "sort"
  7. "strings"
  8. "unicode"
  9. "unicode/utf16"
  10. "unsafe"
  11. "github.com/goccy/go-json/internal/errors"
  12. )
  13. type structFieldSet struct {
  14. dec Decoder
  15. offset uintptr
  16. isTaggedKey bool
  17. fieldIdx int
  18. key string
  19. keyLen int64
  20. err error
  21. }
  22. type structDecoder struct {
  23. fieldMap map[string]*structFieldSet
  24. fieldUniqueNameNum int
  25. stringDecoder *stringDecoder
  26. structName string
  27. fieldName string
  28. isTriedOptimize bool
  29. keyBitmapUint8 [][256]uint8
  30. keyBitmapUint16 [][256]uint16
  31. sortedFieldSets []*structFieldSet
  32. keyDecoder func(*structDecoder, []byte, int64) (int64, *structFieldSet, error)
  33. keyStreamDecoder func(*structDecoder, *Stream) (*structFieldSet, string, error)
  34. }
  35. var (
  36. largeToSmallTable [256]byte
  37. )
  38. func init() {
  39. for i := 0; i < 256; i++ {
  40. c := i
  41. if 'A' <= c && c <= 'Z' {
  42. c += 'a' - 'A'
  43. }
  44. largeToSmallTable[i] = byte(c)
  45. }
  46. }
  47. func toASCIILower(s string) string {
  48. b := []byte(s)
  49. for i := range b {
  50. b[i] = largeToSmallTable[b[i]]
  51. }
  52. return string(b)
  53. }
  54. func newStructDecoder(structName, fieldName string, fieldMap map[string]*structFieldSet) *structDecoder {
  55. return &structDecoder{
  56. fieldMap: fieldMap,
  57. stringDecoder: newStringDecoder(structName, fieldName),
  58. structName: structName,
  59. fieldName: fieldName,
  60. keyDecoder: decodeKey,
  61. keyStreamDecoder: decodeKeyStream,
  62. }
  63. }
  64. const (
  65. allowOptimizeMaxKeyLen = 64
  66. allowOptimizeMaxFieldLen = 16
  67. )
  68. func (d *structDecoder) tryOptimize() {
  69. fieldUniqueNameMap := map[string]int{}
  70. fieldIdx := -1
  71. for k, v := range d.fieldMap {
  72. lower := strings.ToLower(k)
  73. idx, exists := fieldUniqueNameMap[lower]
  74. if exists {
  75. v.fieldIdx = idx
  76. } else {
  77. fieldIdx++
  78. v.fieldIdx = fieldIdx
  79. }
  80. fieldUniqueNameMap[lower] = fieldIdx
  81. }
  82. d.fieldUniqueNameNum = len(fieldUniqueNameMap)
  83. if d.isTriedOptimize {
  84. return
  85. }
  86. fieldMap := map[string]*structFieldSet{}
  87. conflicted := map[string]struct{}{}
  88. for k, v := range d.fieldMap {
  89. key := strings.ToLower(k)
  90. if key != k {
  91. if key != toASCIILower(k) {
  92. d.isTriedOptimize = true
  93. return
  94. }
  95. // already exists same key (e.g. Hello and HELLO has same lower case key
  96. if _, exists := conflicted[key]; exists {
  97. d.isTriedOptimize = true
  98. return
  99. }
  100. conflicted[key] = struct{}{}
  101. }
  102. if field, exists := fieldMap[key]; exists {
  103. if field != v {
  104. d.isTriedOptimize = true
  105. return
  106. }
  107. }
  108. fieldMap[key] = v
  109. }
  110. if len(fieldMap) > allowOptimizeMaxFieldLen {
  111. d.isTriedOptimize = true
  112. return
  113. }
  114. var maxKeyLen int
  115. sortedKeys := []string{}
  116. for key := range fieldMap {
  117. keyLen := len(key)
  118. if keyLen > allowOptimizeMaxKeyLen {
  119. d.isTriedOptimize = true
  120. return
  121. }
  122. if maxKeyLen < keyLen {
  123. maxKeyLen = keyLen
  124. }
  125. sortedKeys = append(sortedKeys, key)
  126. }
  127. sort.Strings(sortedKeys)
  128. // By allocating one extra capacity than `maxKeyLen`,
  129. // it is possible to avoid the process of comparing the index of the key with the length of the bitmap each time.
  130. bitmapLen := maxKeyLen + 1
  131. if len(sortedKeys) <= 8 {
  132. keyBitmap := make([][256]uint8, bitmapLen)
  133. for i, key := range sortedKeys {
  134. for j := 0; j < len(key); j++ {
  135. c := key[j]
  136. keyBitmap[j][c] |= (1 << uint(i))
  137. }
  138. d.sortedFieldSets = append(d.sortedFieldSets, fieldMap[key])
  139. }
  140. d.keyBitmapUint8 = keyBitmap
  141. d.keyDecoder = decodeKeyByBitmapUint8
  142. d.keyStreamDecoder = decodeKeyByBitmapUint8Stream
  143. } else {
  144. keyBitmap := make([][256]uint16, bitmapLen)
  145. for i, key := range sortedKeys {
  146. for j := 0; j < len(key); j++ {
  147. c := key[j]
  148. keyBitmap[j][c] |= (1 << uint(i))
  149. }
  150. d.sortedFieldSets = append(d.sortedFieldSets, fieldMap[key])
  151. }
  152. d.keyBitmapUint16 = keyBitmap
  153. d.keyDecoder = decodeKeyByBitmapUint16
  154. d.keyStreamDecoder = decodeKeyByBitmapUint16Stream
  155. }
  156. }
  157. // decode from '\uXXXX'
  158. func decodeKeyCharByUnicodeRune(buf []byte, cursor int64) ([]byte, int64, error) {
  159. const defaultOffset = 4
  160. const surrogateOffset = 6
  161. if cursor+defaultOffset >= int64(len(buf)) {
  162. return nil, 0, errors.ErrUnexpectedEndOfJSON("escaped string", cursor)
  163. }
  164. r := unicodeToRune(buf[cursor : cursor+defaultOffset])
  165. if utf16.IsSurrogate(r) {
  166. cursor += defaultOffset
  167. if cursor+surrogateOffset >= int64(len(buf)) || buf[cursor] != '\\' || buf[cursor+1] != 'u' {
  168. return []byte(string(unicode.ReplacementChar)), cursor + defaultOffset - 1, nil
  169. }
  170. cursor += 2
  171. r2 := unicodeToRune(buf[cursor : cursor+defaultOffset])
  172. if r := utf16.DecodeRune(r, r2); r != unicode.ReplacementChar {
  173. return []byte(string(r)), cursor + defaultOffset - 1, nil
  174. }
  175. }
  176. return []byte(string(r)), cursor + defaultOffset - 1, nil
  177. }
  178. func decodeKeyCharByEscapedChar(buf []byte, cursor int64) ([]byte, int64, error) {
  179. c := buf[cursor]
  180. cursor++
  181. switch c {
  182. case '"':
  183. return []byte{'"'}, cursor, nil
  184. case '\\':
  185. return []byte{'\\'}, cursor, nil
  186. case '/':
  187. return []byte{'/'}, cursor, nil
  188. case 'b':
  189. return []byte{'\b'}, cursor, nil
  190. case 'f':
  191. return []byte{'\f'}, cursor, nil
  192. case 'n':
  193. return []byte{'\n'}, cursor, nil
  194. case 'r':
  195. return []byte{'\r'}, cursor, nil
  196. case 't':
  197. return []byte{'\t'}, cursor, nil
  198. case 'u':
  199. return decodeKeyCharByUnicodeRune(buf, cursor)
  200. }
  201. return nil, cursor, nil
  202. }
  203. func decodeKeyByBitmapUint8(d *structDecoder, buf []byte, cursor int64) (int64, *structFieldSet, error) {
  204. var (
  205. curBit uint8 = math.MaxUint8
  206. )
  207. b := (*sliceHeader)(unsafe.Pointer(&buf)).data
  208. for {
  209. switch char(b, cursor) {
  210. case ' ', '\n', '\t', '\r':
  211. cursor++
  212. case '"':
  213. cursor++
  214. c := char(b, cursor)
  215. switch c {
  216. case '"':
  217. cursor++
  218. return cursor, nil, nil
  219. case nul:
  220. return 0, nil, errors.ErrUnexpectedEndOfJSON("string", cursor)
  221. }
  222. keyIdx := 0
  223. bitmap := d.keyBitmapUint8
  224. start := cursor
  225. for {
  226. c := char(b, cursor)
  227. switch c {
  228. case '"':
  229. fieldSetIndex := bits.TrailingZeros8(curBit)
  230. field := d.sortedFieldSets[fieldSetIndex]
  231. keyLen := cursor - start
  232. cursor++
  233. if keyLen < field.keyLen {
  234. // early match
  235. return cursor, nil, nil
  236. }
  237. return cursor, field, nil
  238. case nul:
  239. return 0, nil, errors.ErrUnexpectedEndOfJSON("string", cursor)
  240. case '\\':
  241. cursor++
  242. chars, nextCursor, err := decodeKeyCharByEscapedChar(buf, cursor)
  243. if err != nil {
  244. return 0, nil, err
  245. }
  246. for _, c := range chars {
  247. curBit &= bitmap[keyIdx][largeToSmallTable[c]]
  248. if curBit == 0 {
  249. return decodeKeyNotFound(b, cursor)
  250. }
  251. keyIdx++
  252. }
  253. cursor = nextCursor
  254. default:
  255. curBit &= bitmap[keyIdx][largeToSmallTable[c]]
  256. if curBit == 0 {
  257. return decodeKeyNotFound(b, cursor)
  258. }
  259. keyIdx++
  260. }
  261. cursor++
  262. }
  263. default:
  264. return cursor, nil, errors.ErrInvalidBeginningOfValue(char(b, cursor), cursor)
  265. }
  266. }
  267. }
  268. func decodeKeyByBitmapUint16(d *structDecoder, buf []byte, cursor int64) (int64, *structFieldSet, error) {
  269. var (
  270. curBit uint16 = math.MaxUint16
  271. )
  272. b := (*sliceHeader)(unsafe.Pointer(&buf)).data
  273. for {
  274. switch char(b, cursor) {
  275. case ' ', '\n', '\t', '\r':
  276. cursor++
  277. case '"':
  278. cursor++
  279. c := char(b, cursor)
  280. switch c {
  281. case '"':
  282. cursor++
  283. return cursor, nil, nil
  284. case nul:
  285. return 0, nil, errors.ErrUnexpectedEndOfJSON("string", cursor)
  286. }
  287. keyIdx := 0
  288. bitmap := d.keyBitmapUint16
  289. start := cursor
  290. for {
  291. c := char(b, cursor)
  292. switch c {
  293. case '"':
  294. fieldSetIndex := bits.TrailingZeros16(curBit)
  295. field := d.sortedFieldSets[fieldSetIndex]
  296. keyLen := cursor - start
  297. cursor++
  298. if keyLen < field.keyLen {
  299. // early match
  300. return cursor, nil, nil
  301. }
  302. return cursor, field, nil
  303. case nul:
  304. return 0, nil, errors.ErrUnexpectedEndOfJSON("string", cursor)
  305. case '\\':
  306. cursor++
  307. chars, nextCursor, err := decodeKeyCharByEscapedChar(buf, cursor)
  308. if err != nil {
  309. return 0, nil, err
  310. }
  311. for _, c := range chars {
  312. curBit &= bitmap[keyIdx][largeToSmallTable[c]]
  313. if curBit == 0 {
  314. return decodeKeyNotFound(b, cursor)
  315. }
  316. keyIdx++
  317. }
  318. cursor = nextCursor
  319. default:
  320. curBit &= bitmap[keyIdx][largeToSmallTable[c]]
  321. if curBit == 0 {
  322. return decodeKeyNotFound(b, cursor)
  323. }
  324. keyIdx++
  325. }
  326. cursor++
  327. }
  328. default:
  329. return cursor, nil, errors.ErrInvalidBeginningOfValue(char(b, cursor), cursor)
  330. }
  331. }
  332. }
  333. func decodeKeyNotFound(b unsafe.Pointer, cursor int64) (int64, *structFieldSet, error) {
  334. for {
  335. cursor++
  336. switch char(b, cursor) {
  337. case '"':
  338. cursor++
  339. return cursor, nil, nil
  340. case '\\':
  341. cursor++
  342. if char(b, cursor) == nul {
  343. return 0, nil, errors.ErrUnexpectedEndOfJSON("string", cursor)
  344. }
  345. case nul:
  346. return 0, nil, errors.ErrUnexpectedEndOfJSON("string", cursor)
  347. }
  348. }
  349. }
  350. func decodeKey(d *structDecoder, buf []byte, cursor int64) (int64, *structFieldSet, error) {
  351. key, c, err := d.stringDecoder.decodeByte(buf, cursor)
  352. if err != nil {
  353. return 0, nil, err
  354. }
  355. cursor = c
  356. k := *(*string)(unsafe.Pointer(&key))
  357. field, exists := d.fieldMap[k]
  358. if !exists {
  359. return cursor, nil, nil
  360. }
  361. return cursor, field, nil
  362. }
  363. func decodeKeyByBitmapUint8Stream(d *structDecoder, s *Stream) (*structFieldSet, string, error) {
  364. var (
  365. curBit uint8 = math.MaxUint8
  366. )
  367. _, cursor, p := s.stat()
  368. for {
  369. switch char(p, cursor) {
  370. case ' ', '\n', '\t', '\r':
  371. cursor++
  372. case nul:
  373. s.cursor = cursor
  374. if s.read() {
  375. _, cursor, p = s.stat()
  376. continue
  377. }
  378. return nil, "", errors.ErrInvalidBeginningOfValue(char(p, cursor), s.totalOffset())
  379. case '"':
  380. cursor++
  381. FIRST_CHAR:
  382. start := cursor
  383. switch char(p, cursor) {
  384. case '"':
  385. cursor++
  386. s.cursor = cursor
  387. return nil, "", nil
  388. case nul:
  389. s.cursor = cursor
  390. if s.read() {
  391. _, cursor, p = s.stat()
  392. goto FIRST_CHAR
  393. }
  394. return nil, "", errors.ErrUnexpectedEndOfJSON("string", s.totalOffset())
  395. }
  396. keyIdx := 0
  397. bitmap := d.keyBitmapUint8
  398. for {
  399. c := char(p, cursor)
  400. switch c {
  401. case '"':
  402. fieldSetIndex := bits.TrailingZeros8(curBit)
  403. field := d.sortedFieldSets[fieldSetIndex]
  404. keyLen := cursor - start
  405. cursor++
  406. s.cursor = cursor
  407. if keyLen < field.keyLen {
  408. // early match
  409. return nil, field.key, nil
  410. }
  411. return field, field.key, nil
  412. case nul:
  413. s.cursor = cursor
  414. if s.read() {
  415. _, cursor, p = s.stat()
  416. continue
  417. }
  418. return nil, "", errors.ErrUnexpectedEndOfJSON("string", s.totalOffset())
  419. case '\\':
  420. s.cursor = cursor + 1 // skip '\' char
  421. chars, err := decodeKeyCharByEscapeCharStream(s)
  422. if err != nil {
  423. return nil, "", err
  424. }
  425. cursor = s.cursor
  426. for _, c := range chars {
  427. curBit &= bitmap[keyIdx][largeToSmallTable[c]]
  428. if curBit == 0 {
  429. s.cursor = cursor
  430. return decodeKeyNotFoundStream(s, start)
  431. }
  432. keyIdx++
  433. }
  434. default:
  435. curBit &= bitmap[keyIdx][largeToSmallTable[c]]
  436. if curBit == 0 {
  437. s.cursor = cursor
  438. return decodeKeyNotFoundStream(s, start)
  439. }
  440. keyIdx++
  441. }
  442. cursor++
  443. }
  444. default:
  445. return nil, "", errors.ErrInvalidBeginningOfValue(char(p, cursor), s.totalOffset())
  446. }
  447. }
  448. }
  449. func decodeKeyByBitmapUint16Stream(d *structDecoder, s *Stream) (*structFieldSet, string, error) {
  450. var (
  451. curBit uint16 = math.MaxUint16
  452. )
  453. _, cursor, p := s.stat()
  454. for {
  455. switch char(p, cursor) {
  456. case ' ', '\n', '\t', '\r':
  457. cursor++
  458. case nul:
  459. s.cursor = cursor
  460. if s.read() {
  461. _, cursor, p = s.stat()
  462. continue
  463. }
  464. return nil, "", errors.ErrInvalidBeginningOfValue(char(p, cursor), s.totalOffset())
  465. case '"':
  466. cursor++
  467. FIRST_CHAR:
  468. start := cursor
  469. switch char(p, cursor) {
  470. case '"':
  471. cursor++
  472. s.cursor = cursor
  473. return nil, "", nil
  474. case nul:
  475. s.cursor = cursor
  476. if s.read() {
  477. _, cursor, p = s.stat()
  478. goto FIRST_CHAR
  479. }
  480. return nil, "", errors.ErrUnexpectedEndOfJSON("string", s.totalOffset())
  481. }
  482. keyIdx := 0
  483. bitmap := d.keyBitmapUint16
  484. for {
  485. c := char(p, cursor)
  486. switch c {
  487. case '"':
  488. fieldSetIndex := bits.TrailingZeros16(curBit)
  489. field := d.sortedFieldSets[fieldSetIndex]
  490. keyLen := cursor - start
  491. cursor++
  492. s.cursor = cursor
  493. if keyLen < field.keyLen {
  494. // early match
  495. return nil, field.key, nil
  496. }
  497. return field, field.key, nil
  498. case nul:
  499. s.cursor = cursor
  500. if s.read() {
  501. _, cursor, p = s.stat()
  502. continue
  503. }
  504. return nil, "", errors.ErrUnexpectedEndOfJSON("string", s.totalOffset())
  505. case '\\':
  506. s.cursor = cursor + 1 // skip '\' char
  507. chars, err := decodeKeyCharByEscapeCharStream(s)
  508. if err != nil {
  509. return nil, "", err
  510. }
  511. cursor = s.cursor
  512. for _, c := range chars {
  513. curBit &= bitmap[keyIdx][largeToSmallTable[c]]
  514. if curBit == 0 {
  515. s.cursor = cursor
  516. return decodeKeyNotFoundStream(s, start)
  517. }
  518. keyIdx++
  519. }
  520. default:
  521. curBit &= bitmap[keyIdx][largeToSmallTable[c]]
  522. if curBit == 0 {
  523. s.cursor = cursor
  524. return decodeKeyNotFoundStream(s, start)
  525. }
  526. keyIdx++
  527. }
  528. cursor++
  529. }
  530. default:
  531. return nil, "", errors.ErrInvalidBeginningOfValue(char(p, cursor), s.totalOffset())
  532. }
  533. }
  534. }
  535. // decode from '\uXXXX'
  536. func decodeKeyCharByUnicodeRuneStream(s *Stream) ([]byte, error) {
  537. const defaultOffset = 4
  538. const surrogateOffset = 6
  539. if s.cursor+defaultOffset >= s.length {
  540. if !s.read() {
  541. return nil, errors.ErrInvalidCharacter(s.char(), "escaped unicode char", s.totalOffset())
  542. }
  543. }
  544. r := unicodeToRune(s.buf[s.cursor : s.cursor+defaultOffset])
  545. if utf16.IsSurrogate(r) {
  546. s.cursor += defaultOffset
  547. if s.cursor+surrogateOffset >= s.length {
  548. s.read()
  549. }
  550. if s.cursor+surrogateOffset >= s.length || s.buf[s.cursor] != '\\' || s.buf[s.cursor+1] != 'u' {
  551. s.cursor += defaultOffset - 1
  552. return []byte(string(unicode.ReplacementChar)), nil
  553. }
  554. r2 := unicodeToRune(s.buf[s.cursor+defaultOffset+2 : s.cursor+surrogateOffset])
  555. if r := utf16.DecodeRune(r, r2); r != unicode.ReplacementChar {
  556. s.cursor += defaultOffset - 1
  557. return []byte(string(r)), nil
  558. }
  559. }
  560. s.cursor += defaultOffset - 1
  561. return []byte(string(r)), nil
  562. }
  563. func decodeKeyCharByEscapeCharStream(s *Stream) ([]byte, error) {
  564. c := s.buf[s.cursor]
  565. s.cursor++
  566. RETRY:
  567. switch c {
  568. case '"':
  569. return []byte{'"'}, nil
  570. case '\\':
  571. return []byte{'\\'}, nil
  572. case '/':
  573. return []byte{'/'}, nil
  574. case 'b':
  575. return []byte{'\b'}, nil
  576. case 'f':
  577. return []byte{'\f'}, nil
  578. case 'n':
  579. return []byte{'\n'}, nil
  580. case 'r':
  581. return []byte{'\r'}, nil
  582. case 't':
  583. return []byte{'\t'}, nil
  584. case 'u':
  585. return decodeKeyCharByUnicodeRuneStream(s)
  586. case nul:
  587. if !s.read() {
  588. return nil, errors.ErrInvalidCharacter(s.char(), "escaped char", s.totalOffset())
  589. }
  590. goto RETRY
  591. default:
  592. return nil, errors.ErrUnexpectedEndOfJSON("struct field", s.totalOffset())
  593. }
  594. }
  595. func decodeKeyNotFoundStream(s *Stream, start int64) (*structFieldSet, string, error) {
  596. buf, cursor, p := s.stat()
  597. for {
  598. cursor++
  599. switch char(p, cursor) {
  600. case '"':
  601. b := buf[start:cursor]
  602. key := *(*string)(unsafe.Pointer(&b))
  603. cursor++
  604. s.cursor = cursor
  605. return nil, key, nil
  606. case '\\':
  607. cursor++
  608. if char(p, cursor) == nul {
  609. s.cursor = cursor
  610. if !s.read() {
  611. return nil, "", errors.ErrUnexpectedEndOfJSON("string", s.totalOffset())
  612. }
  613. buf, cursor, p = s.statForRetry()
  614. }
  615. case nul:
  616. s.cursor = cursor
  617. if !s.read() {
  618. return nil, "", errors.ErrUnexpectedEndOfJSON("string", s.totalOffset())
  619. }
  620. buf, cursor, p = s.statForRetry()
  621. }
  622. }
  623. }
  624. func decodeKeyStream(d *structDecoder, s *Stream) (*structFieldSet, string, error) {
  625. key, err := d.stringDecoder.decodeStreamByte(s)
  626. if err != nil {
  627. return nil, "", err
  628. }
  629. k := *(*string)(unsafe.Pointer(&key))
  630. return d.fieldMap[k], k, nil
  631. }
  632. func (d *structDecoder) DecodeStream(s *Stream, depth int64, p unsafe.Pointer) error {
  633. depth++
  634. if depth > maxDecodeNestingDepth {
  635. return errors.ErrExceededMaxDepth(s.char(), s.cursor)
  636. }
  637. c := s.skipWhiteSpace()
  638. switch c {
  639. case 'n':
  640. if err := nullBytes(s); err != nil {
  641. return err
  642. }
  643. return nil
  644. default:
  645. if s.char() != '{' {
  646. return errors.ErrInvalidBeginningOfValue(s.char(), s.totalOffset())
  647. }
  648. }
  649. s.cursor++
  650. if s.skipWhiteSpace() == '}' {
  651. s.cursor++
  652. return nil
  653. }
  654. var (
  655. seenFields map[int]struct{}
  656. seenFieldNum int
  657. )
  658. firstWin := (s.Option.Flags & FirstWinOption) != 0
  659. if firstWin {
  660. seenFields = make(map[int]struct{}, d.fieldUniqueNameNum)
  661. }
  662. for {
  663. s.reset()
  664. field, key, err := d.keyStreamDecoder(d, s)
  665. if err != nil {
  666. return err
  667. }
  668. if s.skipWhiteSpace() != ':' {
  669. return errors.ErrExpected("colon after object key", s.totalOffset())
  670. }
  671. s.cursor++
  672. if field != nil {
  673. if field.err != nil {
  674. return field.err
  675. }
  676. if firstWin {
  677. if _, exists := seenFields[field.fieldIdx]; exists {
  678. if err := s.skipValue(depth); err != nil {
  679. return err
  680. }
  681. } else {
  682. if err := field.dec.DecodeStream(s, depth, unsafe.Pointer(uintptr(p)+field.offset)); err != nil {
  683. return err
  684. }
  685. seenFieldNum++
  686. if d.fieldUniqueNameNum <= seenFieldNum {
  687. return s.skipObject(depth)
  688. }
  689. seenFields[field.fieldIdx] = struct{}{}
  690. }
  691. } else {
  692. if err := field.dec.DecodeStream(s, depth, unsafe.Pointer(uintptr(p)+field.offset)); err != nil {
  693. return err
  694. }
  695. }
  696. } else if s.DisallowUnknownFields {
  697. return fmt.Errorf("json: unknown field %q", key)
  698. } else {
  699. if err := s.skipValue(depth); err != nil {
  700. return err
  701. }
  702. }
  703. c := s.skipWhiteSpace()
  704. if c == '}' {
  705. s.cursor++
  706. return nil
  707. }
  708. if c != ',' {
  709. return errors.ErrExpected("comma after object element", s.totalOffset())
  710. }
  711. s.cursor++
  712. }
  713. }
  714. func (d *structDecoder) Decode(ctx *RuntimeContext, cursor, depth int64, p unsafe.Pointer) (int64, error) {
  715. buf := ctx.Buf
  716. depth++
  717. if depth > maxDecodeNestingDepth {
  718. return 0, errors.ErrExceededMaxDepth(buf[cursor], cursor)
  719. }
  720. buflen := int64(len(buf))
  721. cursor = skipWhiteSpace(buf, cursor)
  722. b := (*sliceHeader)(unsafe.Pointer(&buf)).data
  723. switch char(b, cursor) {
  724. case 'n':
  725. if err := validateNull(buf, cursor); err != nil {
  726. return 0, err
  727. }
  728. cursor += 4
  729. return cursor, nil
  730. case '{':
  731. default:
  732. return 0, errors.ErrInvalidBeginningOfValue(char(b, cursor), cursor)
  733. }
  734. cursor++
  735. cursor = skipWhiteSpace(buf, cursor)
  736. if buf[cursor] == '}' {
  737. cursor++
  738. return cursor, nil
  739. }
  740. var (
  741. seenFields map[int]struct{}
  742. seenFieldNum int
  743. )
  744. firstWin := (ctx.Option.Flags & FirstWinOption) != 0
  745. if firstWin {
  746. seenFields = make(map[int]struct{}, d.fieldUniqueNameNum)
  747. }
  748. for {
  749. c, field, err := d.keyDecoder(d, buf, cursor)
  750. if err != nil {
  751. return 0, err
  752. }
  753. cursor = skipWhiteSpace(buf, c)
  754. if char(b, cursor) != ':' {
  755. return 0, errors.ErrExpected("colon after object key", cursor)
  756. }
  757. cursor++
  758. if cursor >= buflen {
  759. return 0, errors.ErrExpected("object value after colon", cursor)
  760. }
  761. if field != nil {
  762. if field.err != nil {
  763. return 0, field.err
  764. }
  765. if firstWin {
  766. if _, exists := seenFields[field.fieldIdx]; exists {
  767. c, err := skipValue(buf, cursor, depth)
  768. if err != nil {
  769. return 0, err
  770. }
  771. cursor = c
  772. } else {
  773. c, err := field.dec.Decode(ctx, cursor, depth, unsafe.Pointer(uintptr(p)+field.offset))
  774. if err != nil {
  775. return 0, err
  776. }
  777. cursor = c
  778. seenFieldNum++
  779. if d.fieldUniqueNameNum <= seenFieldNum {
  780. return skipObject(buf, cursor, depth)
  781. }
  782. seenFields[field.fieldIdx] = struct{}{}
  783. }
  784. } else {
  785. c, err := field.dec.Decode(ctx, cursor, depth, unsafe.Pointer(uintptr(p)+field.offset))
  786. if err != nil {
  787. return 0, err
  788. }
  789. cursor = c
  790. }
  791. } else {
  792. c, err := skipValue(buf, cursor, depth)
  793. if err != nil {
  794. return 0, err
  795. }
  796. cursor = c
  797. }
  798. cursor = skipWhiteSpace(buf, cursor)
  799. if char(b, cursor) == '}' {
  800. cursor++
  801. return cursor, nil
  802. }
  803. if char(b, cursor) != ',' {
  804. return 0, errors.ErrExpected("comma after object element", cursor)
  805. }
  806. cursor++
  807. }
  808. }
  809. func (d *structDecoder) DecodePath(ctx *RuntimeContext, cursor, depth int64) ([][]byte, int64, error) {
  810. return nil, 0, fmt.Errorf("json: struct decoder does not support decode path")
  811. }