From: YenForYang Date: Tue, 28 Sep 2021 23:30:35 +0000 (-0500) Subject: bencode: optimize `(*Decoder).parseStringInterface()` (#659) X-Git-Tag: v1.32.0~16 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=37455d3c6b8e50f8916980b099794d8f40191043;p=btrtrc.git bencode: optimize `(*Decoder).parseStringInterface()` (#659) --- diff --git a/bencode/decode.go b/bencode/decode.go index 9c42578a..0054c867 100644 --- a/bencode/decode.go +++ b/bencode/decode.go @@ -611,28 +611,27 @@ func (d *Decoder) parseIntInterface() (ret interface{}) { return } -func (d *Decoder) parseStringInterface() interface{} { - start := d.Offset - 1 - +func (d *Decoder) parseStringInterface() (s string) { // read the string length first d.readUntil(':') - length, err := strconv.ParseInt(d.buf.String(), 10, 64) - checkForIntParseError(err, start) - - d.buf.Reset() - n, err := io.CopyN(&d.buf, d.r, length) - d.Offset += n + length, err := strconv.ParseInt(bytesAsString(d.buf.Bytes()), 10, 64) if err != nil { - checkForUnexpectedEOF(err, d.Offset) - panic(&SyntaxError{ - Offset: d.Offset, - What: errors.New("unexpected I/O error: " + err.Error()), - }) + panic(&SyntaxError{Offset: d.Offset-1, What: err}) } - - s := d.buf.String() d.buf.Reset() - return s + n, err := d.buf.ReadFrom(io.LimitReader(d.r, length)) + d.Offset += n + switch err { + case nil: + s = d.buf.String() + d.buf.Reset() + return + case io.EOF: + err = io.ErrUnexpectedEOF + default: + err = errors.New("unexpected I/O error: " + err.Error()) + } + panic(&SyntaxError{Offset: d.Offset, What: err}) } func (d *Decoder) parseDictInterface() interface{} {