Browse Source

codec: bufioDecReader: do not implement io.(ByteScanner|Reader) - its unnecessary

This allows us handle state changes directly, as opposed to returning n, err and
handling that in the necessary methods.
Ugorji Nwoke 7 years ago
parent
commit
7d13b37dbe
2 changed files with 33 additions and 76 deletions
  1. 3 3
      codec/codec_test.go
  2. 30 73
      codec/decode.go

+ 3 - 3
codec/codec_test.go

@@ -2569,7 +2569,7 @@ func TestBufioDecReader(t *testing.T) {
 	var r = strings.NewReader(s)
 	var br = &bufioDecReader{buf: make([]byte, 0, 13)}
 	br.r = r
-	b, err := ioutil.ReadAll(br)
+	b, err := ioutil.ReadAll(br.r)
 	if err != nil {
 		panic(err)
 	}
@@ -2613,7 +2613,7 @@ func TestBufioDecReader(t *testing.T) {
 		out = br.readUntil(nil, '0')
 		testDeepEqualErr(string(out), `      0`, t, "-")
 		// fmt.Printf("readUntil: out: `%s`\n", out)
-		br.UnreadByte()
+		br.unreadn1()
 	}
 	br = &bufioDecReader{buf: make([]byte, 0, 7)}
 	br.r = strings.NewReader(s)
@@ -2625,7 +2625,7 @@ func TestBufioDecReader(t *testing.T) {
 		token = br.skip(&jsonCharWhitespaceSet)
 		testDeepEqualErr(token, byte('0'), t, "-")
 		// fmt.Printf("skip: token: '%c'\n", token)
-		br.UnreadByte()
+		br.unreadn1()
 	}
 	// println()
 }

+ 30 - 73
codec/decode.go

@@ -549,12 +549,12 @@ func (z *bufioDecReader) reset(r io.Reader) {
 	z.c, z.err = 0, nil
 }
 
-func (z *bufioDecReader) Read(p []byte) (n int, err error) {
+func (z *bufioDecReader) readb(p []byte) {
 	if z.err != nil {
-		return 0, z.err
+		panic(z.err)
 	}
 	p0 := p
-	n = copy(p, z.buf[z.c:])
+	n := copy(p, z.buf[z.c:])
 	z.c += n
 	if z.c == len(z.buf) {
 		z.c = 0
@@ -574,15 +574,13 @@ func (z *bufioDecReader) Read(p []byte) (n int, err error) {
 	p = p[n:]
 	var n2 int
 	// if we are here, then z.buf is all read
-	if len(p) > len(z.buf) {
-		n2, err = decReadFull(z.r, p)
+	if len(p) > cap(z.buf) {
+		n2, z.err = decReadFull(z.r, p)
+		if z.err != nil {
+			panic(z.err)
+		}
 		n += n2
 		z.n += n2
-		z.err = err
-		// don't return EOF if some bytes were read. keep for next time.
-		if n > 0 && err == io.EOF {
-			err = nil
-		}
 		// always keep last byte in z.buf
 		z.buf = z.buf[:1]
 		z.buf[0] = p[len(p)-1]
@@ -592,15 +590,14 @@ func (z *bufioDecReader) Read(p []byte) (n int, err error) {
 		}
 		return
 	}
-	// z.c is now 0, and len(p) <= len(z.buf)
+	// z.c is now 0, and len(p) <= cap(z.buf)
 	for len(p) > 0 && z.err == nil {
-		// println("len(p) loop starting ... ")
 		z.c = 0
 		z.buf = z.buf[0:cap(z.buf)]
-		n2, err = z.r.Read(z.buf)
+		n2, z.err = z.r.Read(z.buf)
 		if n2 > 0 {
-			if err == io.EOF {
-				err = nil
+			if z.err == io.EOF { // only have z.err=EOF iff n==0
+				z.err = nil
 			}
 			z.buf = z.buf[:n2]
 			n2 = copy(p, z.buf)
@@ -609,8 +606,6 @@ func (z *bufioDecReader) Read(p []byte) (n int, err error) {
 			z.n += n2
 			p = p[n2:]
 		}
-		z.err = err
-		// println("... len(p) loop done")
 	}
 	if z.c == 0 {
 		z.buf = z.buf[:1]
@@ -620,13 +615,15 @@ func (z *bufioDecReader) Read(p []byte) (n int, err error) {
 	if z.trb {
 		z.tr = append(z.tr, p0[:n]...)
 	}
-	return
+	if len(p) > 0 && z.err != nil {
+		panic(z.err)
+	}
 }
 
-func (z *bufioDecReader) ReadByte() (b byte, err error) {
+func (z *bufioDecReader) readn1() (b byte) {
 	// fast-path, so we elide calling into Read() most of the time
 	// if z.err == nil && z.c < (len(z.buf)-1) {
-	if z.c < (len(z.buf) - 1) { // means z.err == nil, and we don't read to end of buf
+	if z.c < len(z.buf) { // means z.err == nil, and we don't read to end of buf
 		b = z.buf[z.c]
 		z.c++
 		z.n++
@@ -635,25 +632,22 @@ func (z *bufioDecReader) ReadByte() (b byte, err error) {
 		}
 		return
 	}
-	// z.b[0] = 0 // unnecessary, as err is returned if problem
-	_, err = z.Read(z.b[:1])
-	b = z.b[0]
-	return
+	z.readb(z.b[:1])
+	return z.b[0]
 }
 
-func (z *bufioDecReader) UnreadByte() (err error) {
+func (z *bufioDecReader) unreadn1() {
 	if z.err != nil {
-		return z.err
+		panic(z.err)
 	}
-	if z.c > 0 {
-		z.c--
-		z.n--
-		if z.trb {
-			z.tr = z.tr[:len(z.tr)-1]
-		}
-		return
+	if z.c == 0 {
+		panic(errDecUnreadByteNothingToRead)
+	}
+	z.c--
+	z.n--
+	if z.trb {
+		z.tr = z.tr[:len(z.tr)-1]
 	}
-	return errDecUnreadByteNothingToRead
 }
 
 func (z *bufioDecReader) readx(n int) (bs []byte) {
@@ -673,40 +667,10 @@ func (z *bufioDecReader) readx(n int) (bs []byte) {
 		return
 	}
 	bs = make([]byte, n)
-	_, err := z.Read(bs)
-	if err != nil {
-		panic(err)
-	}
-	return
-}
-
-func (z *bufioDecReader) readb(bs []byte) {
-	_, err := z.Read(bs)
-	if err != nil {
-		panic(err)
-	}
-}
-
-func (z *bufioDecReader) readn1() (b uint8) {
-	b, err := z.ReadByte()
-	if err != nil {
-		panic(err)
-	}
+	z.readb(bs)
 	return
 }
 
-// func (z *bufioDecReader) readn1eof() (b uint8, eof bool) {
-// 	b, err := z.ReadByte()
-// 	if err != nil {
-// 		if err == io.EOF {
-// 			eof = true
-// 		} else {
-// 			panic(err)
-// 		}
-// 	}
-// 	return
-// }
-
 func (z *bufioDecReader) skipLoopFn(i int) {
 	z.n += (i - z.c) - 1
 	i++
@@ -850,13 +814,6 @@ func (z *bufioDecReader) readUntil(in []byte, stop byte) (out []byte) {
 	}
 }
 
-func (z *bufioDecReader) unreadn1() {
-	err := z.UnreadByte()
-	if err != nil {
-		panic(err)
-	}
-}
-
 // ------------------------------------
 
 var errBytesDecReaderCannotUnread = errors.New("cannot unread last byte read")
@@ -3031,7 +2988,7 @@ func decReadFull(r io.Reader, bs []byte) (n int, err error) {
 			n += nn
 		}
 	}
-
+	// xdebugf("decReadFull: len(bs): %v, n: %v, err: %v", len(bs), n, err)
 	// do not do this - it serves no purpose
 	// if n != len(bs) && err == io.EOF { err = io.ErrUnexpectedEOF }
 	return