aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKeith Randall <khr@golang.org>2014-08-28 23:26:50 -0700
committerKeith Randall <khr@golang.org>2014-08-28 23:26:50 -0700
commitef64d9ffcc237fde9bcaed1fd00c5036c4f489de (patch)
tree0f84c6b2d6d9ac23545f4d8bc2c086bc82a7a87d /src
parent6a76bca33ffc83254edb9878679f11f4ba8e1b37 (diff)
downloadgo-ef64d9ffcc237fde9bcaed1fd00c5036c4f489de.tar.xz
runtime: don't allocate a new string in printf
LGTM=dave R=rsc, dave CC=golang-codereviews https://golang.org/cl/139890043
Diffstat (limited to 'src')
-rw-r--r--src/pkg/runtime/print1.go2
-rw-r--r--src/pkg/runtime/string.c1
-rw-r--r--src/pkg/runtime/stubs.go1
3 files changed, 3 insertions, 1 deletions
diff --git a/src/pkg/runtime/print1.go b/src/pkg/runtime/print1.go
index 94ba9e4733..9df6a621bb 100644
--- a/src/pkg/runtime/print1.go
+++ b/src/pkg/runtime/print1.go
@@ -39,7 +39,7 @@ func goprintf(s string) {
// and type tables.
//go:nosplit
func printf(s *byte) {
- vprintf(gostring(s), add(unsafe.Pointer(&s), unsafe.Sizeof(s)))
+ vprintf(gostringnocopy(s), add(unsafe.Pointer(&s), unsafe.Sizeof(s)))
}
// sprintf is only called from C code.
diff --git a/src/pkg/runtime/string.c b/src/pkg/runtime/string.c
index 60a0545a9a..5421b53196 100644
--- a/src/pkg/runtime/string.c
+++ b/src/pkg/runtime/string.c
@@ -90,6 +90,7 @@ runtime·gobytes(byte *p, intgo n)
return sl;
}
+#pragma textflag NOSPLIT
String
runtime·gostringnocopy(byte *str)
{
diff --git a/src/pkg/runtime/stubs.go b/src/pkg/runtime/stubs.go
index 26126fcf9a..2014dfbf90 100644
--- a/src/pkg/runtime/stubs.go
+++ b/src/pkg/runtime/stubs.go
@@ -203,6 +203,7 @@ func noteclear(n *note)
func lock(lk *mutex)
func unlock(lk *mutex)
func purgecachedstats(c *mcache)
+func gostringnocopy(b *byte) string
//go:noescape
func write(fd uintptr, p unsafe.Pointer, n int32) int32