summaryrefslogtreecommitdiff
path: root/decode_scan.go
diff options
context:
space:
mode:
Diffstat (limited to 'decode_scan.go')
-rw-r--r--decode_scan.go23
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),