]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/obj: remove Biobuf unget
authorDave Cheney <dave@cheney.net>
Fri, 1 May 2015 05:29:11 +0000 (15:29 +1000)
committerDave Cheney <dave@cheney.net>
Fri, 1 May 2015 23:08:18 +0000 (23:08 +0000)
This change applies CL 9365 to the copy of Biobuf in cmd/internal/obj.

In the process I discovered that some of the methods that should have been
checking the unget buffer before reading were not and it was probably just
dumb luck that we handn't hit these issues before; Bungetc is only used in
one place in cmd/internal/gc and only an unlikely code path.

Change-Id: Ifa0c5c08442e9fe951a5078c6e9ec77a8a4dc2ff
Reviewed-on: https://go-review.googlesource.com/9529
Reviewed-by: Daniel Morsing <daniel.morsing@gmail.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Dave Cheney <dave@cheney.net>
Run-TryBot: Dave Cheney <dave@cheney.net>

src/cmd/internal/gc/lex.go
src/cmd/internal/obj/util.go

index edfb6ca7d72a6237fbde35a3af926f52c755e3d7..c2c4207998b89713060f7538680b0fbede2f6206 100644 (file)
@@ -1865,20 +1865,21 @@ func getc() int {
                        curio.cp = curio.cp[1:]
                }
        } else {
-               var c1 int
-               var c2 int
        loop:
                c = obj.Bgetc(curio.bin)
                if c == 0xef {
-                       c1 = obj.Bgetc(curio.bin)
-                       c2 = obj.Bgetc(curio.bin)
-                       if c1 == 0xbb && c2 == 0xbf {
+                       buf, err := curio.bin.Peek(2)
+                       if err != nil {
+                               log.Fatalf("getc: peeking: %v", err)
+                       }
+                       if buf[0] == 0xbb && buf[1] == 0xbf {
                                yyerrorl(int(lexlineno), "Unicode (UTF-8) BOM in middle of file")
+
+                               // consume BOM bytes
+                               obj.Bgetc(curio.bin)
+                               obj.Bgetc(curio.bin)
                                goto loop
                        }
-
-                       obj.Bungetc(curio.bin)
-                       obj.Bungetc(curio.bin)
                }
        }
 
index 71587954f4682d9aa4250fa50bec354351e0391d..b44b9caf3813617502a5b5b94e1a877ac36e00e9 100644 (file)
@@ -28,12 +28,10 @@ func Cputime() float64 {
 }
 
 type Biobuf struct {
-       unget    [2]int
-       numUnget int
-       f        *os.File
-       r        *bufio.Reader
-       w        *bufio.Writer
-       linelen  int
+       f       *os.File
+       r       *bufio.Reader
+       w       *bufio.Writer
+       linelen int
 }
 
 func Bopenw(name string) (*Biobuf, error) {
@@ -116,18 +114,11 @@ func Bread(b *Biobuf, p []byte) int {
 }
 
 func Bgetc(b *Biobuf) int {
-       if b.numUnget > 0 {
-               b.numUnget--
-               return int(b.unget[b.numUnget])
-       }
        c, err := b.r.ReadByte()
-       r := int(c)
        if err != nil {
-               r = -1
+               return -1
        }
-       b.unget[1] = b.unget[0]
-       b.unget[0] = r
-       return r
+       return int(c)
 }
 
 func Bgetrune(b *Biobuf) int {
@@ -146,6 +137,10 @@ func (b *Biobuf) Read(p []byte) (int, error) {
        return b.r.Read(p)
 }
 
+func (b *Biobuf) Peek(n int) ([]byte, error) {
+       return b.r.Peek(n)
+}
+
 func Brdline(b *Biobuf, delim int) string {
        s, err := b.r.ReadBytes(byte(delim))
        if err != nil {
@@ -181,10 +176,6 @@ func Blinelen(b *Biobuf) int {
        return b.linelen
 }
 
-func Bungetc(b *Biobuf) {
-       b.numUnget++
-}
-
 func Bterm(b *Biobuf) error {
        var err error
        if b.w != nil {