]> Sergey Matveev's repositories - btrtrc.git/commitdiff
bencode: optimize `(*Decoder).parseStringInterface()` (#659)
authorYenForYang <YenForYang@users.noreply.github.com>
Tue, 28 Sep 2021 23:30:35 +0000 (18:30 -0500)
committerGitHub <noreply@github.com>
Tue, 28 Sep 2021 23:30:35 +0000 (09:30 +1000)
bencode/decode.go

index 9c42578a7ed7387a5783ab07db61a016e96b74cb..0054c8678ea8c067d997a7992ed83539b1cea006 100644 (file)
@@ -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{} {