diff options
| author | Robert Griesemer <gri@golang.org> | 2011-09-29 09:40:59 -0700 |
|---|---|---|
| committer | Robert Griesemer <gri@golang.org> | 2011-09-29 09:40:59 -0700 |
| commit | 61cc8728fbf52dbe5e76cea19aac8b87d2173174 (patch) | |
| tree | 60682c931585873e92ada53931ce16427a80628f /src/pkg/encoding | |
| parent | 092a211fb99ba8fa922f6529473b279b24cb18a5 (diff) | |
| download | go-61cc8728fbf52dbe5e76cea19aac8b87d2173174.tar.xz | |
encoding/binary: PutX functions require buffer of sufficient size.
R=rsc
CC=golang-dev
https://golang.org/cl/5163041
Diffstat (limited to 'src/pkg/encoding')
| -rw-r--r-- | src/pkg/encoding/binary/varint.go | 24 | ||||
| -rw-r--r-- | src/pkg/encoding/binary/varint_test.go | 15 |
2 files changed, 7 insertions, 32 deletions
diff --git a/src/pkg/encoding/binary/varint.go b/src/pkg/encoding/binary/varint.go index 1439dd3faa..c98e0e2bf5 100644 --- a/src/pkg/encoding/binary/varint.go +++ b/src/pkg/encoding/binary/varint.go @@ -37,27 +37,15 @@ const ( ) // PutUvarint encodes a uint64 into buf and returns the number of bytes written. -// If the buffer is too small, the result is the negated number of bytes required -// (that is, -PutUvarint(nil, x) is the number of bytes required to encode x). func PutUvarint(buf []byte, x uint64) int { - var i int - for i = range buf { - if x < 0x80 { - buf[i] = byte(x) - return i + 1 - } + i := 0 + for x >= 0x80 { buf[i] = byte(x) | 0x80 x >>= 7 - } - // buffer too small; compute number of bytes required - for x >= 0x4000 { - x >>= 2 * 7 - i += 2 - } - if x >= 0x80 { i++ } - return -(i + 1) + buf[i] = byte(x) + return i + 1 } // Uvarint decodes a uint64 from buf and returns that value and the @@ -85,8 +73,6 @@ func Uvarint(buf []byte) (uint64, int) { } // PutVarint encodes an int64 into buf and returns the number of bytes written. -// If the buffer is too small, the result is the negated number of bytes required -// (that is, -PutVarint(nil, x) is the number of bytes required to encode x). func PutVarint(buf []byte, x int64) int { ux := uint64(x) << 1 if x < 0 { @@ -115,7 +101,7 @@ func Varint(buf []byte) (int64, int) { // WriteUvarint encodes x and writes the result to w. func WriteUvarint(w io.Writer, x uint64) os.Error { var buf [MaxVarintLen64]byte - n := PutUvarint(buf[:], x) // won't fail + n := PutUvarint(buf[:], x) _, err := w.Write(buf[0:n]) return err } diff --git a/src/pkg/encoding/binary/varint_test.go b/src/pkg/encoding/binary/varint_test.go index a85aceeeac..1ceb4cd4b1 100644 --- a/src/pkg/encoding/binary/varint_test.go +++ b/src/pkg/encoding/binary/varint_test.go @@ -11,7 +11,8 @@ import ( ) func testConstant(t *testing.T, w uint, max int) { - n := -PutUvarint(nil, 1<<w-1) + var buf [MaxVarintLen64]byte + n := PutUvarint(buf[:], 1<<w-1) if n != max { t.Errorf("MaxVarintLen%d = %d; want %d", w, max, n) } @@ -121,18 +122,6 @@ func TestUvarint(t *testing.T) { } func TestBufferTooSmall(t *testing.T) { - for i := 0; i < 10; i++ { - buf := make([]byte, i) - x := uint64(1) << (uint(i) * 7) - n0 := -i - if i == 0 { - n0 = -1 // encoding 0 takes one byte - } - if n := PutUvarint(buf, x); n != n0 { - t.Errorf("PutUvarint([%d]byte, %d): got n = %d; want %d", len(buf), x, n, n0) - } - } - buf := []byte{0x80, 0x80, 0x80, 0x80} for i := 0; i <= len(buf); i++ { buf := buf[0:i] |
