diff options
Diffstat (limited to 'vendor/github.com/bytedance/sonic/internal/decoder/stream.go')
-rw-r--r-- | vendor/github.com/bytedance/sonic/internal/decoder/stream.go | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/stream.go b/vendor/github.com/bytedance/sonic/internal/decoder/stream.go index e1e0f73b9..a3716435a 100644 --- a/vendor/github.com/bytedance/sonic/internal/decoder/stream.go +++ b/vendor/github.com/bytedance/sonic/internal/decoder/stream.go @@ -21,8 +21,9 @@ import ( `io` `sync` - `github.com/bytedance/sonic/option` + `github.com/bytedance/sonic/internal/native` `github.com/bytedance/sonic/internal/native/types` + `github.com/bytedance/sonic/option` ) var ( @@ -71,6 +72,7 @@ func (self *StreamDecoder) Decode(val interface{}) (err error) { var first = true var repeat = true + read_more: for { l := len(buf) @@ -97,11 +99,20 @@ read_more: l := len(buf) if l > 0 { self.Decoder.Reset(string(buf)) - err = self.Decoder.Decode(val) - if err != nil { - if repeat && self.repeatable(err) { + + var x int + if ret := native.SkipOneFast(&self.s, &x); ret < 0 { + if repeat { goto read_more + } else { + err = SyntaxError{x, self.s, types.ParsingError(-ret), ""} + self.err = err + return } + } + + err = self.Decoder.Decode(val) + if err != nil { self.err = err } |