mirror of
https://github.com/golang/go
synced 2024-10-14 03:43:28 +00:00
runtime: make gostringnocopy update maxstring
Fixes #8706 LGTM=josharian R=josharian CC=golang-codereviews https://golang.org/cl/143880043
This commit is contained in:
parent
6e55f7a87b
commit
bcd36e8857
|
@ -160,3 +160,6 @@ func GostringW(w []uint16) (s string) {
|
|||
})
|
||||
return
|
||||
}
|
||||
|
||||
var Gostringnocopy = gostringnocopy
|
||||
var Maxstring = &maxstring
|
||||
|
|
|
@ -42,10 +42,15 @@ String
|
|||
runtime·gostringnocopy(byte *str)
|
||||
{
|
||||
String s;
|
||||
uintptr ms;
|
||||
|
||||
s.str = str;
|
||||
s.len = runtime·findnull(str);
|
||||
return s;
|
||||
while(true) {
|
||||
ms = runtime·maxstring;
|
||||
if(s.len <= ms || runtime·casp((void**)&runtime·maxstring, (void*)ms, (void*)s.len))
|
||||
return s;
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: move this elsewhere
|
||||
|
|
|
@ -145,3 +145,16 @@ func main() {
|
|||
panic(s)
|
||||
}
|
||||
`
|
||||
|
||||
func TestGostringnocopy(t *testing.T) {
|
||||
max := *runtime.Maxstring
|
||||
b := make([]byte, max+10)
|
||||
for i := uintptr(0); i < max+9; i++ {
|
||||
b[i] = 'a'
|
||||
}
|
||||
_ = runtime.Gostringnocopy(&b[0])
|
||||
newmax := *runtime.Maxstring
|
||||
if newmax != max+9 {
|
||||
t.Errorf("want %d, got %d", max+9, newmax)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue