summaryrefslogtreecommitdiff
path: root/decode_scan.go
diff options
context:
space:
mode:
Diffstat (limited to 'decode_scan.go')
-rw-r--r--decode_scan.go15
1 files changed, 15 insertions, 0 deletions
diff --git a/decode_scan.go b/decode_scan.go
index 63694c4..940de49 100644
--- a/decode_scan.go
+++ b/decode_scan.go
@@ -6,6 +6,7 @@ package lowmemjson
import (
"io"
+ "unicode/utf8"
"git.lukeshu.com/go/lowmemjson/internal/jsonparse"
)
@@ -55,6 +56,17 @@ func (sc *runeTypeScanner) ReadRuneType() (rune, int, jsonparse.RuneType, error)
sc.offset += int64(sc.rSize)
switch err {
case nil:
+ invalidUTF8 := false
+ 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
+ b, _ := bs.ReadByte()
+ _ = bs.UnreadByte()
+ _, _, _ = sc.inner.ReadRune()
+ sc.rRune = rune(b)
+ invalidUTF8 = true
+ }
+ }
sc.rType, err = sc.parser.HandleRune(sc.rRune)
if err != nil {
sc.rErr = &DecodeSyntaxError{
@@ -62,6 +74,9 @@ func (sc *runeTypeScanner) ReadRuneType() (rune, int, jsonparse.RuneType, error)
Err: err,
}
} else {
+ if invalidUTF8 {
+ sc.rRune = utf8.RuneError
+ }
sc.rErr = nil
}
switch sc.rType {