From c0efcac6a97588f7013b7ec09dd56cb780bdce64 Mon Sep 17 00:00:00 2001 From: Gustavo Niemeyer Date: Fri, 20 Jul 2012 16:04:22 -0300 Subject: [PATCH] bytes: make Join return a new buffer on len(a) == 1 Fixes #3844. R=golang-dev, r CC=golang-dev https://golang.org/cl/6432054 --- src/pkg/bytes/bytes.go | 11 +++++------ src/pkg/bytes/bytes_test.go | 6 ++++++ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/pkg/bytes/bytes.go b/src/pkg/bytes/bytes.go index 09b3c1a270..c3980bb2ab 100644 --- a/src/pkg/bytes/bytes.go +++ b/src/pkg/bytes/bytes.go @@ -333,14 +333,15 @@ func FieldsFunc(s []byte, f func(rune) bool) [][]byte { return a[0:na] } -// Join concatenates the elements of a to create a single byte array. The separator +// Join concatenates the elements of a to create a new byte array. The separator // sep is placed between elements in the resulting array. func Join(a [][]byte, sep []byte) []byte { if len(a) == 0 { return []byte{} } if len(a) == 1 { - return a[0] + // Just return a copy. + return append([]byte(nil), a[0]...) } n := len(sep) * (len(a) - 1) for i := 0; i < len(a); i++ { @@ -619,10 +620,8 @@ func Replace(s, old, new []byte, n int) []byte { m = Count(s, old) } if m == 0 { - // Nothing to do. Just copy. - t := make([]byte, len(s)) - copy(t, s) - return t + // Just return a copy. + return append([]byte(nil), s...) } if n < 0 || m < n { n = m diff --git a/src/pkg/bytes/bytes_test.go b/src/pkg/bytes/bytes_test.go index 000f235176..0e2ef504cf 100644 --- a/src/pkg/bytes/bytes_test.go +++ b/src/pkg/bytes/bytes_test.go @@ -490,6 +490,12 @@ func TestSplit(t *testing.T) { t.Errorf("Split disagrees withSplitN(%q, %q, %d) = %v; want %v", tt.s, tt.sep, tt.n, b, a) } } + if len(a) > 0 { + in, out := a[0], s + if cap(in) == cap(out) && &in[:1][0] == &out[:1][0] { + t.Errorf("Join(%#v, %q) didn't copy", a, tt.sep) + } + } } } -- 2.48.1