]> Cypherpunks repositories - gostls13.git/commitdiff
bufio.UnreadRune: fix bug at EOF
authorRob Pike <r@golang.org>
Fri, 24 Sep 2010 02:28:14 +0000 (12:28 +1000)
committerRob Pike <r@golang.org>
Fri, 24 Sep 2010 02:28:14 +0000 (12:28 +1000)
Fixes #1132.

R=rsc
CC=golang-dev
https://golang.org/cl/2215045

src/pkg/bufio/bufio.go
src/pkg/bufio/bufio_test.go

index b85a0793ccf8bb4189c372d3945a992f09344c8c..1cac0792748a30450bd80989488e4fde9a91414a 100644 (file)
@@ -207,6 +207,7 @@ func (b *Reader) ReadRune() (rune int, size int, err os.Error) {
        for b.r+utf8.UTFMax > b.w && !utf8.FullRune(b.buf[b.r:b.w]) && b.err == nil {
                b.fill()
        }
+       b.lastRuneSize = -1
        if b.r == b.w {
                return 0, 0, b.err
        }
index 5df97bd2454506c0160553ca348d61e8671cb886..fb0ed045aebc4bd6b515ec18cfba26b97baa2c50 100644 (file)
@@ -319,6 +319,20 @@ func TestUnreadRuneError(t *testing.T) {
        }
 }
 
+func TestUnreadRuneAtEOF(t *testing.T) {
+       // UnreadRune/ReadRune should error at EOF (was a bug; used to panic)
+       r := NewReader(strings.NewReader("x"))
+       r.ReadRune()
+       r.ReadRune()
+       r.UnreadRune()
+       _, _, err := r.ReadRune()
+       if err == nil {
+               t.Error("expected error at EOF")
+       } else if err != os.EOF {
+               t.Error("expected EOF; got", err)
+       }
+}
+
 func TestReadWriteRune(t *testing.T) {
        const NRune = 1000
        byteBuf := new(bytes.Buffer)