From 0c112bc16d6970db1bee35710f6c8b0622510663 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Sat, 18 Feb 2023 15:05:42 -0700 Subject: decode_scan: Move Reset() to be by PopReadBarrier() --- decode_scan.go | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) (limited to 'decode_scan.go') diff --git a/decode_scan.go b/decode_scan.go index 7a52975..b0fc7c3 100644 --- a/decode_scan.go +++ b/decode_scan.go @@ -28,28 +28,6 @@ type runeTypeScanner struct { rErr error } -func (sc *runeTypeScanner) Reset() { - sc.parser.Reset() - if sc.repeat || (sc.rType == jsonparse.RuneTypeEOF && sc.rSize > 0) { - sc.repeat = false - // re-figure the rType and rErr - var err error - sc.rType, err = sc.parser.HandleRune(sc.rRune) - if err != nil { - sc.rErr = &DecodeSyntaxError{ - Offset: sc.offset - int64(sc.rSize), - Err: err, - } - } else { - sc.rErr = nil - } - // tell it to use that rType and rErr - _ = sc.UnreadRune() // we set it up to always succeed - } else { - sc.initialized = false - } -} - // The returned error is a *ReadError, a *SyntaxError, or nil. // An EOF condition is represented as one of: // @@ -161,3 +139,25 @@ func (sc *runeTypeScanner) PopReadBarrier() { } } } + +func (sc *runeTypeScanner) Reset() { + sc.parser.Reset() + if sc.repeat || (sc.rType == jsonparse.RuneTypeEOF && sc.rSize > 0) { + sc.repeat = false + // re-figure the rType and rErr + var err error + sc.rType, err = sc.parser.HandleRune(sc.rRune) + if err != nil { + sc.rErr = &DecodeSyntaxError{ + Offset: sc.offset - int64(sc.rSize), + Err: err, + } + } else { + sc.rErr = nil + } + // tell it to use that rType and rErr + _ = sc.UnreadRune() // we set it up to always succeed + } else { + sc.initialized = false + } +} -- cgit v1.2.3-2-g168b From 595249c55c24828c04ab682dd3b35883b74aa790 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Sat, 18 Feb 2023 17:25:21 -0700 Subject: decode_scan: PopReadBarrier, Reset: De-couple the .repeat and EOF cases This duplicates code, but it's confusing thinking about them together. --- decode_scan.go | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) (limited to 'decode_scan.go') diff --git a/decode_scan.go b/decode_scan.go index b0fc7c3..507bc42 100644 --- a/decode_scan.go +++ b/decode_scan.go @@ -111,7 +111,20 @@ func (sc *runeTypeScanner) PushReadBarrier() { func (sc *runeTypeScanner) PopReadBarrier() { sc.parser.PopBarrier() - if sc.repeat || (sc.rType == jsonparse.RuneTypeEOF && sc.rSize > 0) { + switch { + case sc.repeat: + // re-figure the rType and rErr + var err error + sc.rType, err = sc.parser.HandleRune(sc.rRune) + if err != nil { + sc.rErr = &DecodeSyntaxError{ + Offset: sc.offset - int64(sc.rSize), + Err: err, + } + } else { + sc.rErr = nil + } + case sc.rType == jsonparse.RuneTypeEOF && sc.rSize > 0: // re-figure the rType and rErr var err error sc.rType, err = sc.parser.HandleRune(sc.rRune) @@ -125,7 +138,7 @@ func (sc *runeTypeScanner) PopReadBarrier() { } // tell it to use that rType and rErr _ = sc.UnreadRune() // we set it up to always succeed - } else if sc.rType == jsonparse.RuneTypeEOF { + case sc.rType == jsonparse.RuneTypeEOF: // re-figure the rType and rErr var err error sc.rType, err = sc.parser.HandleEOF() @@ -142,8 +155,20 @@ func (sc *runeTypeScanner) PopReadBarrier() { func (sc *runeTypeScanner) Reset() { sc.parser.Reset() - if sc.repeat || (sc.rType == jsonparse.RuneTypeEOF && sc.rSize > 0) { - sc.repeat = false + switch { + case sc.repeat: + // re-figure the rType and rErr + var err error + sc.rType, err = sc.parser.HandleRune(sc.rRune) + if err != nil { + sc.rErr = &DecodeSyntaxError{ + Offset: sc.offset - int64(sc.rSize), + Err: err, + } + } else { + sc.rErr = nil + } + case sc.rType == jsonparse.RuneTypeEOF && sc.rSize > 0: // re-figure the rType and rErr var err error sc.rType, err = sc.parser.HandleRune(sc.rRune) @@ -157,7 +182,7 @@ func (sc *runeTypeScanner) Reset() { } // tell it to use that rType and rErr _ = sc.UnreadRune() // we set it up to always succeed - } else { + default: sc.initialized = false } } -- cgit v1.2.3-2-g168b From 113aa7184e1d2f3858e68301dd1c2a6de51e6c1a Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Sat, 18 Feb 2023 18:00:24 -0700 Subject: decode_scan: Go ahead and decrement sc.offset when unreading --- decode_scan.go | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) (limited to 'decode_scan.go') diff --git a/decode_scan.go b/decode_scan.go index 507bc42..85f3190 100644 --- a/decode_scan.go +++ b/decode_scan.go @@ -40,6 +40,7 @@ func (sc *runeTypeScanner) ReadRuneType() (rune, int, jsonparse.RuneType, error) case sc.initialized && (sc.rType == jsonparse.RuneTypeError || sc.rType == jsonparse.RuneTypeEOF): // do nothing case sc.repeat: + sc.offset += int64(sc.rSize) _, _, _ = sc.inner.ReadRune() default: sc.initialized = true @@ -93,16 +94,13 @@ func (sc *runeTypeScanner) UnreadRune() error { return ErrInvalidUnreadRune } sc.repeat = true + sc.offset -= int64(sc.rSize) _ = sc.inner.UnreadRune() return nil } func (sc *runeTypeScanner) InputOffset() int64 { - ret := sc.offset - if sc.repeat { - ret -= int64(sc.rSize) - } - return ret + return sc.offset } func (sc *runeTypeScanner) PushReadBarrier() { -- cgit v1.2.3-2-g168b From 56e05985f999e9f3d8cda96026f5a2f68d28d016 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Sat, 18 Feb 2023 18:07:16 -0700 Subject: decode_scan: s/initialized/rTypeOK/ --- decode_scan.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'decode_scan.go') diff --git a/decode_scan.go b/decode_scan.go index 85f3190..1f29a95 100644 --- a/decode_scan.go +++ b/decode_scan.go @@ -19,8 +19,8 @@ type runeTypeScanner struct { parser jsonparse.Parser // initialized by constructor offset int64 - initialized bool - repeat bool + rTypeOK bool + repeat bool rRune rune rSize int @@ -37,13 +37,13 @@ type runeTypeScanner struct { // end of file at start of value: (_, 0, RuneTypeError, &DecodeSyntaxError{Offset: offset: Err: io.EOF}) func (sc *runeTypeScanner) ReadRuneType() (rune, int, jsonparse.RuneType, error) { switch { - case sc.initialized && (sc.rType == jsonparse.RuneTypeError || sc.rType == jsonparse.RuneTypeEOF): + case sc.rTypeOK && (sc.rType == jsonparse.RuneTypeError || sc.rType == jsonparse.RuneTypeEOF): // do nothing case sc.repeat: sc.offset += int64(sc.rSize) _, _, _ = sc.inner.ReadRune() default: - sc.initialized = true + sc.rTypeOK = true again: var err error sc.rRune, sc.rSize, err = sc.inner.ReadRune() @@ -181,6 +181,6 @@ func (sc *runeTypeScanner) Reset() { // tell it to use that rType and rErr _ = sc.UnreadRune() // we set it up to always succeed default: - sc.initialized = false + sc.rTypeOK = false } } -- cgit v1.2.3-2-g168b From ec0482f598f4b7b05c21b1d19fe8183665e3fe93 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Sat, 18 Feb 2023 22:45:18 -0700 Subject: decode_scan: Fix a doc comment --- decode_scan.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'decode_scan.go') diff --git a/decode_scan.go b/decode_scan.go index 1f29a95..7911c01 100644 --- a/decode_scan.go +++ b/decode_scan.go @@ -84,11 +84,11 @@ func (sc *runeTypeScanner) ReadRuneType() (rune, int, jsonparse.RuneType, error) return sc.rRune, sc.rSize, sc.rType, sc.rErr } -// UnreadRune undoes a call to .ReadRune() or .ReadRuneType(). +// UnreadRune undoes a call to .ReadRuneType(). // -// If the last call to .ReadRune() or .ReadRuneType() has already been -// unread, or if that call returned a rune with size 0, then -// ErrInvalidUnreadRune is returned. Otherwise, nil is returned. +// If the last call to .ReadRuneType() has already been unread, or if +// that call returned a rune with size 0, then ErrInvalidUnreadRune is +// returned. Otherwise, nil is returned. func (sc *runeTypeScanner) UnreadRune() error { if sc.repeat || sc.rSize == 0 { return ErrInvalidUnreadRune -- cgit v1.2.3-2-g168b