]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.2] strings: fix Replacer bug with prefix matches
authorAndrew Gerrand <adg@golang.org>
Fri, 1 Nov 2013 00:18:49 +0000 (11:18 +1100)
committerAndrew Gerrand <adg@golang.org>
Fri, 1 Nov 2013 00:18:49 +0000 (11:18 +1100)
««« CL 16880043 / 0eb6508d3e88
strings: fix Replacer bug with prefix matches

singleStringReplacer had a bug where if a string was replaced
at the beginning and no output had yet been produced into the
temp buffer before matching ended, an invalid nil check (used
as a proxy for having matched anything) meant it always
returned its input.

Fixes #6659

R=golang-dev, r
CC=golang-dev
https://golang.org/cl/16880043
»»»

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

src/pkg/strings/replace.go
src/pkg/strings/replace_test.go

index f63b1792c56583c9573fc76faa85f64a55a01cb6..54c9323e0489137a5b19f8f5ab2974c8d2d89014 100644 (file)
@@ -364,17 +364,18 @@ func makeSingleStringReplacer(pattern string, value string) *singleStringReplace
 
 func (r *singleStringReplacer) Replace(s string) string {
        var buf []byte
-       i := 0
+       i, matched := 0, false
        for {
                match := r.finder.next(s[i:])
                if match == -1 {
                        break
                }
+               matched = true
                buf = append(buf, s[i:i+match]...)
                buf = append(buf, r.value...)
                i += match + len(r.finder.pattern)
        }
-       if buf == nil {
+       if !matched {
                return s
        }
        buf = append(buf, s[i:]...)
index d33dea95b09bedae242c195a5f13c1c1c312a91a..82e4b6ef08ebfa46a60a4a2e4daf745d4cfb9f39 100644 (file)
@@ -261,10 +261,21 @@ func TestReplacer(t *testing.T) {
        testCases = append(testCases,
                testCase{abcMatcher, "", ""},
                testCase{abcMatcher, "ab", "ab"},
+               testCase{abcMatcher, "abc", "[match]"},
                testCase{abcMatcher, "abcd", "[match]d"},
                testCase{abcMatcher, "cabcabcdabca", "c[match][match]d[match]a"},
        )
 
+       // Issue 6659 cases (more single string replacer)
+
+       noHello := NewReplacer("Hello", "")
+       testCases = append(testCases,
+               testCase{noHello, "Hello", ""},
+               testCase{noHello, "Hellox", "x"},
+               testCase{noHello, "xHello", "x"},
+               testCase{noHello, "xHellox", "xx"},
+       )
+
        // No-arg test cases.
 
        nop := NewReplacer()