diff options
author | Luke Shumaker <lukeshu@lukeshu.com> | 2023-02-25 16:17:01 -0700 |
---|---|---|
committer | Luke Shumaker <lukeshu@lukeshu.com> | 2023-02-25 17:51:36 -0700 |
commit | f68498a6fdb421483d9aebb45527452f6255bb68 (patch) | |
tree | eb2bd34a7c51a8df7239b0174a939ee64b136467 /decode_scan.go | |
parent | 7301cd6c4e97b272bd708d4c87d26609510e6ca7 (diff) |
jsonparse: Don't show raw bytes as Unicode
Diffstat (limited to 'decode_scan.go')
-rw-r--r-- | decode_scan.go | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/decode_scan.go b/decode_scan.go index 940de49..7ef3e71 100644 --- a/decode_scan.go +++ b/decode_scan.go @@ -23,10 +23,11 @@ type runeTypeScanner struct { rTypeOK bool repeat bool - rRune rune - rSize int - rType jsonparse.RuneType - rErr error + rRune rune + rSize int + rIsRune bool + rType jsonparse.RuneType + rErr error } // The returned error is a *ReadError, a *SyntaxError, or nil. @@ -56,7 +57,7 @@ func (sc *runeTypeScanner) ReadRuneType() (rune, int, jsonparse.RuneType, error) sc.offset += int64(sc.rSize) switch err { case nil: - invalidUTF8 := false + sc.rIsRune = true if sc.rRune == utf8.RuneError && sc.rSize == 1 { if bs, ok := sc.inner.(io.ByteScanner); ok { _ = bs.UnreadByte() // UnreadRune doesn't back up the ReadByte-pos @@ -64,19 +65,16 @@ func (sc *runeTypeScanner) ReadRuneType() (rune, int, jsonparse.RuneType, error) _ = bs.UnreadByte() _, _, _ = sc.inner.ReadRune() sc.rRune = rune(b) - invalidUTF8 = true + sc.rIsRune = false } } - sc.rType, err = sc.parser.HandleRune(sc.rRune) + sc.rType, err = sc.parser.HandleRune(sc.rRune, sc.rIsRune) if err != nil { sc.rErr = &DecodeSyntaxError{ Offset: sc.offset - int64(sc.rSize), Err: err, } } else { - if invalidUTF8 { - sc.rRune = utf8.RuneError - } sc.rErr = nil } switch sc.rType { @@ -107,6 +105,9 @@ func (sc *runeTypeScanner) ReadRuneType() (rune, int, jsonparse.RuneType, error) } } sc.repeat = false + if sc.rSize > 0 && !sc.rIsRune { + return utf8.RuneError, sc.rSize, sc.rType, sc.rErr + } return sc.rRune, sc.rSize, sc.rType, sc.rErr } @@ -139,7 +140,7 @@ func (sc *runeTypeScanner) PopReadBarrier() { case sc.repeat: // re-figure the rType and rErr var err error - sc.rType, err = sc.parser.HandleRune(sc.rRune) + sc.rType, err = sc.parser.HandleRune(sc.rRune, sc.rIsRune) if err != nil { sc.rErr = &DecodeSyntaxError{ Offset: sc.offset - int64(sc.rSize), |