string.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. package decoder
  2. import (
  3. "bytes"
  4. "fmt"
  5. "reflect"
  6. "unicode"
  7. "unicode/utf16"
  8. "unicode/utf8"
  9. "unsafe"
  10. "github.com/goccy/go-json/internal/errors"
  11. )
  12. type stringDecoder struct {
  13. structName string
  14. fieldName string
  15. }
  16. func newStringDecoder(structName, fieldName string) *stringDecoder {
  17. return &stringDecoder{
  18. structName: structName,
  19. fieldName: fieldName,
  20. }
  21. }
  22. func (d *stringDecoder) errUnmarshalType(typeName string, offset int64) *errors.UnmarshalTypeError {
  23. return &errors.UnmarshalTypeError{
  24. Value: typeName,
  25. Type: reflect.TypeOf(""),
  26. Offset: offset,
  27. Struct: d.structName,
  28. Field: d.fieldName,
  29. }
  30. }
  31. func (d *stringDecoder) DecodeStream(s *Stream, depth int64, p unsafe.Pointer) error {
  32. bytes, err := d.decodeStreamByte(s)
  33. if err != nil {
  34. return err
  35. }
  36. if bytes == nil {
  37. return nil
  38. }
  39. **(**string)(unsafe.Pointer(&p)) = *(*string)(unsafe.Pointer(&bytes))
  40. s.reset()
  41. return nil
  42. }
  43. func (d *stringDecoder) Decode(ctx *RuntimeContext, cursor, depth int64, p unsafe.Pointer) (int64, error) {
  44. bytes, c, err := d.decodeByte(ctx.Buf, cursor)
  45. if err != nil {
  46. return 0, err
  47. }
  48. if bytes == nil {
  49. return c, nil
  50. }
  51. cursor = c
  52. **(**string)(unsafe.Pointer(&p)) = *(*string)(unsafe.Pointer(&bytes))
  53. return cursor, nil
  54. }
  55. var (
  56. hexToInt = [256]int{
  57. '0': 0,
  58. '1': 1,
  59. '2': 2,
  60. '3': 3,
  61. '4': 4,
  62. '5': 5,
  63. '6': 6,
  64. '7': 7,
  65. '8': 8,
  66. '9': 9,
  67. 'A': 10,
  68. 'B': 11,
  69. 'C': 12,
  70. 'D': 13,
  71. 'E': 14,
  72. 'F': 15,
  73. 'a': 10,
  74. 'b': 11,
  75. 'c': 12,
  76. 'd': 13,
  77. 'e': 14,
  78. 'f': 15,
  79. }
  80. )
  81. func unicodeToRune(code []byte) rune {
  82. var r rune
  83. for i := 0; i < len(code); i++ {
  84. r = r*16 + rune(hexToInt[code[i]])
  85. }
  86. return r
  87. }
  88. func readAtLeast(s *Stream, n int64, p *unsafe.Pointer) bool {
  89. for s.cursor+n >= s.length {
  90. if !s.read() {
  91. return false
  92. }
  93. *p = s.bufptr()
  94. }
  95. return true
  96. }
  97. func decodeUnicodeRune(s *Stream, p unsafe.Pointer) (rune, int64, unsafe.Pointer, error) {
  98. const defaultOffset = 5
  99. const surrogateOffset = 11
  100. if !readAtLeast(s, defaultOffset, &p) {
  101. return rune(0), 0, nil, errors.ErrInvalidCharacter(s.char(), "escaped string", s.totalOffset())
  102. }
  103. r := unicodeToRune(s.buf[s.cursor+1 : s.cursor+defaultOffset])
  104. if utf16.IsSurrogate(r) {
  105. if !readAtLeast(s, surrogateOffset, &p) {
  106. return unicode.ReplacementChar, defaultOffset, p, nil
  107. }
  108. if s.buf[s.cursor+defaultOffset] != '\\' || s.buf[s.cursor+defaultOffset+1] != 'u' {
  109. return unicode.ReplacementChar, defaultOffset, p, nil
  110. }
  111. r2 := unicodeToRune(s.buf[s.cursor+defaultOffset+2 : s.cursor+surrogateOffset])
  112. if r := utf16.DecodeRune(r, r2); r != unicode.ReplacementChar {
  113. return r, surrogateOffset, p, nil
  114. }
  115. }
  116. return r, defaultOffset, p, nil
  117. }
  118. func decodeUnicode(s *Stream, p unsafe.Pointer) (unsafe.Pointer, error) {
  119. const backSlashAndULen = 2 // length of \u
  120. r, offset, pp, err := decodeUnicodeRune(s, p)
  121. if err != nil {
  122. return nil, err
  123. }
  124. unicode := []byte(string(r))
  125. unicodeLen := int64(len(unicode))
  126. s.buf = append(append(s.buf[:s.cursor-1], unicode...), s.buf[s.cursor+offset:]...)
  127. unicodeOrgLen := offset - 1
  128. s.length = s.length - (backSlashAndULen + (unicodeOrgLen - unicodeLen))
  129. s.cursor = s.cursor - backSlashAndULen + unicodeLen
  130. return pp, nil
  131. }
  132. func decodeEscapeString(s *Stream, p unsafe.Pointer) (unsafe.Pointer, error) {
  133. s.cursor++
  134. RETRY:
  135. switch s.buf[s.cursor] {
  136. case '"':
  137. s.buf[s.cursor] = '"'
  138. case '\\':
  139. s.buf[s.cursor] = '\\'
  140. case '/':
  141. s.buf[s.cursor] = '/'
  142. case 'b':
  143. s.buf[s.cursor] = '\b'
  144. case 'f':
  145. s.buf[s.cursor] = '\f'
  146. case 'n':
  147. s.buf[s.cursor] = '\n'
  148. case 'r':
  149. s.buf[s.cursor] = '\r'
  150. case 't':
  151. s.buf[s.cursor] = '\t'
  152. case 'u':
  153. return decodeUnicode(s, p)
  154. case nul:
  155. if !s.read() {
  156. return nil, errors.ErrInvalidCharacter(s.char(), "escaped string", s.totalOffset())
  157. }
  158. goto RETRY
  159. default:
  160. return nil, errors.ErrUnexpectedEndOfJSON("string", s.totalOffset())
  161. }
  162. s.buf = append(s.buf[:s.cursor-1], s.buf[s.cursor:]...)
  163. s.length--
  164. s.cursor--
  165. p = s.bufptr()
  166. return p, nil
  167. }
  168. var (
  169. runeErrBytes = []byte(string(utf8.RuneError))
  170. runeErrBytesLen = int64(len(runeErrBytes))
  171. )
  172. func stringBytes(s *Stream) ([]byte, error) {
  173. _, cursor, p := s.stat()
  174. cursor++ // skip double quote char
  175. start := cursor
  176. for {
  177. switch char(p, cursor) {
  178. case '\\':
  179. s.cursor = cursor
  180. pp, err := decodeEscapeString(s, p)
  181. if err != nil {
  182. return nil, err
  183. }
  184. p = pp
  185. cursor = s.cursor
  186. case '"':
  187. literal := s.buf[start:cursor]
  188. cursor++
  189. s.cursor = cursor
  190. return literal, nil
  191. case
  192. // 0x00 is nul, 0x5c is '\\', 0x22 is '"' .
  193. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, // 0x00-0x0F
  194. 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, // 0x10-0x1F
  195. 0x20, 0x21 /*0x22,*/, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, // 0x20-0x2F
  196. 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, // 0x30-0x3F
  197. 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, // 0x40-0x4F
  198. 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B /*0x5C,*/, 0x5D, 0x5E, 0x5F, // 0x50-0x5F
  199. 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, // 0x60-0x6F
  200. 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F: // 0x70-0x7F
  201. // character is ASCII. skip to next char
  202. case
  203. 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, // 0x80-0x8F
  204. 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, // 0x90-0x9F
  205. 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, // 0xA0-0xAF
  206. 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, // 0xB0-0xBF
  207. 0xC0, 0xC1, // 0xC0-0xC1
  208. 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF: // 0xF5-0xFE
  209. // character is invalid
  210. s.buf = append(append(append([]byte{}, s.buf[:cursor]...), runeErrBytes...), s.buf[cursor+1:]...)
  211. _, _, p = s.stat()
  212. cursor += runeErrBytesLen
  213. s.length += runeErrBytesLen
  214. continue
  215. case nul:
  216. s.cursor = cursor
  217. if s.read() {
  218. _, cursor, p = s.stat()
  219. continue
  220. }
  221. goto ERROR
  222. case 0xEF:
  223. // RuneError is {0xEF, 0xBF, 0xBD}
  224. if s.buf[cursor+1] == 0xBF && s.buf[cursor+2] == 0xBD {
  225. // found RuneError: skip
  226. cursor += 2
  227. break
  228. }
  229. fallthrough
  230. default:
  231. // multi bytes character
  232. if !utf8.FullRune(s.buf[cursor : len(s.buf)-1]) {
  233. s.cursor = cursor
  234. if s.read() {
  235. _, cursor, p = s.stat()
  236. continue
  237. }
  238. goto ERROR
  239. }
  240. r, size := utf8.DecodeRune(s.buf[cursor:])
  241. if r == utf8.RuneError {
  242. s.buf = append(append(append([]byte{}, s.buf[:cursor]...), runeErrBytes...), s.buf[cursor+1:]...)
  243. cursor += runeErrBytesLen
  244. s.length += runeErrBytesLen
  245. _, _, p = s.stat()
  246. } else {
  247. cursor += int64(size)
  248. }
  249. continue
  250. }
  251. cursor++
  252. }
  253. ERROR:
  254. return nil, errors.ErrUnexpectedEndOfJSON("string", s.totalOffset())
  255. }
  256. func (d *stringDecoder) decodeStreamByte(s *Stream) ([]byte, error) {
  257. for {
  258. switch s.char() {
  259. case ' ', '\n', '\t', '\r':
  260. s.cursor++
  261. continue
  262. case '[':
  263. return nil, d.errUnmarshalType("array", s.totalOffset())
  264. case '{':
  265. return nil, d.errUnmarshalType("object", s.totalOffset())
  266. case '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
  267. return nil, d.errUnmarshalType("number", s.totalOffset())
  268. case '"':
  269. return stringBytes(s)
  270. case 'n':
  271. if err := nullBytes(s); err != nil {
  272. return nil, err
  273. }
  274. return nil, nil
  275. case nul:
  276. if s.read() {
  277. continue
  278. }
  279. }
  280. break
  281. }
  282. return nil, errors.ErrInvalidBeginningOfValue(s.char(), s.totalOffset())
  283. }
  284. func (d *stringDecoder) decodeByte(buf []byte, cursor int64) ([]byte, int64, error) {
  285. for {
  286. switch buf[cursor] {
  287. case ' ', '\n', '\t', '\r':
  288. cursor++
  289. case '[':
  290. return nil, 0, d.errUnmarshalType("array", cursor)
  291. case '{':
  292. return nil, 0, d.errUnmarshalType("object", cursor)
  293. case '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
  294. return nil, 0, d.errUnmarshalType("number", cursor)
  295. case '"':
  296. cursor++
  297. start := cursor
  298. b := (*sliceHeader)(unsafe.Pointer(&buf)).data
  299. escaped := 0
  300. for {
  301. switch char(b, cursor) {
  302. case '\\':
  303. escaped++
  304. cursor++
  305. switch char(b, cursor) {
  306. case '"', '\\', '/', 'b', 'f', 'n', 'r', 't':
  307. cursor++
  308. case 'u':
  309. buflen := int64(len(buf))
  310. if cursor+5 >= buflen {
  311. return nil, 0, errors.ErrUnexpectedEndOfJSON("escaped string", cursor)
  312. }
  313. for i := int64(1); i <= 4; i++ {
  314. c := char(b, cursor+i)
  315. if !(('0' <= c && c <= '9') || ('a' <= c && c <= 'f') || ('A' <= c && c <= 'F')) {
  316. return nil, 0, errors.ErrSyntax(fmt.Sprintf("json: invalid character %c in \\u hexadecimal character escape", c), cursor+i)
  317. }
  318. }
  319. cursor += 5
  320. default:
  321. return nil, 0, errors.ErrUnexpectedEndOfJSON("escaped string", cursor)
  322. }
  323. continue
  324. case '"':
  325. literal := buf[start:cursor]
  326. if escaped > 0 {
  327. literal = literal[:unescapeString(literal)]
  328. }
  329. cursor++
  330. return literal, cursor, nil
  331. case nul:
  332. return nil, 0, errors.ErrUnexpectedEndOfJSON("string", cursor)
  333. }
  334. cursor++
  335. }
  336. case 'n':
  337. if err := validateNull(buf, cursor); err != nil {
  338. return nil, 0, err
  339. }
  340. cursor += 4
  341. return nil, cursor, nil
  342. default:
  343. return nil, 0, errors.ErrInvalidBeginningOfValue(buf[cursor], cursor)
  344. }
  345. }
  346. }
  347. var unescapeMap = [256]byte{
  348. '"': '"',
  349. '\\': '\\',
  350. '/': '/',
  351. 'b': '\b',
  352. 'f': '\f',
  353. 'n': '\n',
  354. 'r': '\r',
  355. 't': '\t',
  356. }
  357. func unsafeAdd(ptr unsafe.Pointer, offset int) unsafe.Pointer {
  358. return unsafe.Pointer(uintptr(ptr) + uintptr(offset))
  359. }
  360. func unescapeString(buf []byte) int {
  361. p := (*sliceHeader)(unsafe.Pointer(&buf)).data
  362. end := unsafeAdd(p, len(buf))
  363. src := unsafeAdd(p, bytes.IndexByte(buf, '\\'))
  364. dst := src
  365. for src != end {
  366. c := char(src, 0)
  367. if c == '\\' {
  368. escapeChar := char(src, 1)
  369. if escapeChar != 'u' {
  370. *(*byte)(dst) = unescapeMap[escapeChar]
  371. src = unsafeAdd(src, 2)
  372. dst = unsafeAdd(dst, 1)
  373. } else {
  374. v1 := hexToInt[char(src, 2)]
  375. v2 := hexToInt[char(src, 3)]
  376. v3 := hexToInt[char(src, 4)]
  377. v4 := hexToInt[char(src, 5)]
  378. code := rune((v1 << 12) | (v2 << 8) | (v3 << 4) | v4)
  379. if code >= 0xd800 && code < 0xdc00 && uintptr(unsafeAdd(src, 11)) < uintptr(end) {
  380. if char(src, 6) == '\\' && char(src, 7) == 'u' {
  381. v1 := hexToInt[char(src, 8)]
  382. v2 := hexToInt[char(src, 9)]
  383. v3 := hexToInt[char(src, 10)]
  384. v4 := hexToInt[char(src, 11)]
  385. lo := rune((v1 << 12) | (v2 << 8) | (v3 << 4) | v4)
  386. if lo >= 0xdc00 && lo < 0xe000 {
  387. code = (code-0xd800)<<10 | (lo - 0xdc00) + 0x10000
  388. src = unsafeAdd(src, 6)
  389. }
  390. }
  391. }
  392. var b [utf8.UTFMax]byte
  393. n := utf8.EncodeRune(b[:], code)
  394. switch n {
  395. case 4:
  396. *(*byte)(unsafeAdd(dst, 3)) = b[3]
  397. fallthrough
  398. case 3:
  399. *(*byte)(unsafeAdd(dst, 2)) = b[2]
  400. fallthrough
  401. case 2:
  402. *(*byte)(unsafeAdd(dst, 1)) = b[1]
  403. fallthrough
  404. case 1:
  405. *(*byte)(unsafeAdd(dst, 0)) = b[0]
  406. }
  407. src = unsafeAdd(src, 6)
  408. dst = unsafeAdd(dst, n)
  409. }
  410. } else {
  411. *(*byte)(dst) = c
  412. src = unsafeAdd(src, 1)
  413. dst = unsafeAdd(dst, 1)
  414. }
  415. }
  416. return int(uintptr(dst) - uintptr(p))
  417. }