struct.go 19 KB

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