Commit 56b7c61c authored by Keith Randall's avatar Keith Randall Committed by Keith Randall

strings: declare IndexByte as noescape

This lets []byte->string conversions which are used as arguments to
strings.IndexByte and friends have their backing store allocated on
the stack.

It only prevents allocation when the string is small enough (32
bytes), so it isn't perfect. But reusing the []byte backing store
directly requires a bunch more compiler analysis (see #2205 and
related issues).

Fixes #25864.

Change-Id: Ie52430422196e3c91e5529d6e56a8435ced1fc4c
Reviewed-on: https://go-review.googlesource.com/c/146018Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
parent f14067f3
......@@ -240,6 +240,34 @@ func TestCompareTempString(t *testing.T) {
}
}
func TestStringIndexHaystack(t *testing.T) {
// See issue 25864.
haystack := []byte("hello")
needle := "ll"
n := testing.AllocsPerRun(1000, func() {
if strings.Index(string(haystack), needle) != 2 {
t.Fatalf("needle not found")
}
})
if n != 0 {
t.Fatalf("want 0 allocs, got %v", n)
}
}
func TestStringIndexNeedle(t *testing.T) {
// See issue 25864.
haystack := "hello"
needle := []byte("ll")
n := testing.AllocsPerRun(1000, func() {
if strings.Index(haystack, string(needle)) != 2 {
t.Fatalf("needle not found")
}
})
if n != 0 {
t.Fatalf("want 0 allocs, got %v", n)
}
}
func TestStringOnStack(t *testing.T) {
s := ""
for i := 0; i < 3; i++ {
......
......@@ -4,5 +4,7 @@
package strings
//go:noescape
// IndexByte returns the index of the first instance of c in s, or -1 if c is not present in s.
func IndexByte(s string, c byte) int // in internal/bytealg
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment