diff options
author | Russ Cox <rsc@golang.org> | 2010-05-19 21:33:31 -0700 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2010-05-19 21:33:31 -0700 |
commit | ef9b8a7bec35c6c2389333a23229686c5ad388c2 (patch) | |
tree | 8690e50b84b38c5b588ddd6b8faf1c047f823935 | |
parent | dadb8fa07dc0481da3be7ced999b6344b6643139 (diff) | |
download | golang-ef9b8a7bec35c6c2389333a23229686c5ad388c2.tar.gz |
runtime: avoid allocation for fixed strings
R=r
CC=golang-dev
http://codereview.appspot.com/1083041
-rw-r--r-- | src/pkg/runtime/darwin/386/signal.c | 2 | ||||
-rw-r--r-- | src/pkg/runtime/darwin/amd64/signal.c | 2 | ||||
-rw-r--r-- | src/pkg/runtime/freebsd/386/signal.c | 2 | ||||
-rw-r--r-- | src/pkg/runtime/freebsd/amd64/signal.c | 2 | ||||
-rw-r--r-- | src/pkg/runtime/iface.c | 4 | ||||
-rw-r--r-- | src/pkg/runtime/linux/386/signal.c | 2 | ||||
-rw-r--r-- | src/pkg/runtime/linux/amd64/signal.c | 2 | ||||
-rw-r--r-- | src/pkg/runtime/linux/arm/signal.c | 2 | ||||
-rw-r--r-- | src/pkg/runtime/runtime.c | 8 | ||||
-rw-r--r-- | src/pkg/runtime/runtime.h | 1 | ||||
-rw-r--r-- | src/pkg/runtime/string.goc | 10 | ||||
-rw-r--r-- | src/pkg/runtime/symtab.c | 2 |
12 files changed, 25 insertions, 14 deletions
diff --git a/src/pkg/runtime/darwin/386/signal.c b/src/pkg/runtime/darwin/386/signal.c index 5161796dc..7c0c381d3 100644 --- a/src/pkg/runtime/darwin/386/signal.c +++ b/src/pkg/runtime/darwin/386/signal.c @@ -30,7 +30,7 @@ signame(int32 sig) { if(sig < 0 || sig >= NSIG) return emptystring; - return gostring((byte*)sigtab[sig].name); + return gostringnocopy((byte*)sigtab[sig].name); } void diff --git a/src/pkg/runtime/darwin/amd64/signal.c b/src/pkg/runtime/darwin/amd64/signal.c index 56f02e56d..8145e8d8f 100644 --- a/src/pkg/runtime/darwin/amd64/signal.c +++ b/src/pkg/runtime/darwin/amd64/signal.c @@ -38,7 +38,7 @@ signame(int32 sig) { if(sig < 0 || sig >= NSIG) return emptystring; - return gostring((byte*)sigtab[sig].name); + return gostringnocopy((byte*)sigtab[sig].name); } void diff --git a/src/pkg/runtime/freebsd/386/signal.c b/src/pkg/runtime/freebsd/386/signal.c index be2f4ce6f..44a868e35 100644 --- a/src/pkg/runtime/freebsd/386/signal.c +++ b/src/pkg/runtime/freebsd/386/signal.c @@ -41,7 +41,7 @@ signame(int32 sig) { if(sig < 0 || sig >= NSIG) return emptystring; - return gostring((byte*)sigtab[sig].name); + return gostringnocopy((byte*)sigtab[sig].name); } void diff --git a/src/pkg/runtime/freebsd/amd64/signal.c b/src/pkg/runtime/freebsd/amd64/signal.c index b0ac650a3..e153752db 100644 --- a/src/pkg/runtime/freebsd/amd64/signal.c +++ b/src/pkg/runtime/freebsd/amd64/signal.c @@ -49,7 +49,7 @@ signame(int32 sig) { if(sig < 0 || sig >= NSIG) return emptystring; - return gostring((byte*)sigtab[sig].name); + return gostringnocopy((byte*)sigtab[sig].name); } void diff --git a/src/pkg/runtime/iface.c b/src/pkg/runtime/iface.c index 9c2c6b1b5..55a1362c6 100644 --- a/src/pkg/runtime/iface.c +++ b/src/pkg/runtime/iface.c @@ -467,7 +467,7 @@ ifacehash1(void *data, Type *t) if(algarray[alg].hash == nohash) { // calling nohash will panic too, // but we can print a better error. - ·newErrorString(catstring(gostring((byte*)"hash of unhashable type "), *t->string), &err); + ·newErrorString(catstring(gostringnocopy((byte*)"hash of unhashable type "), *t->string), &err); ·panic(err); } if(wid <= sizeof(data)) @@ -501,7 +501,7 @@ ifaceeq1(void *data1, void *data2, Type *t) if(algarray[alg].equal == noequal) { // calling noequal will panic too, // but we can print a better error. - ·newErrorString(catstring(gostring((byte*)"comparing uncomparable type "), *t->string), &err); + ·newErrorString(catstring(gostringnocopy((byte*)"comparing uncomparable type "), *t->string), &err); ·panic(err); } diff --git a/src/pkg/runtime/linux/386/signal.c b/src/pkg/runtime/linux/386/signal.c index 8c76ec366..2d8ad57b2 100644 --- a/src/pkg/runtime/linux/386/signal.c +++ b/src/pkg/runtime/linux/386/signal.c @@ -38,7 +38,7 @@ signame(int32 sig) { if(sig < 0 || sig >= NSIG) return emptystring; - return gostring((byte*)sigtab[sig].name); + return gostringnocopy((byte*)sigtab[sig].name); } void diff --git a/src/pkg/runtime/linux/amd64/signal.c b/src/pkg/runtime/linux/amd64/signal.c index fbe6599f6..1dfeb5f05 100644 --- a/src/pkg/runtime/linux/amd64/signal.c +++ b/src/pkg/runtime/linux/amd64/signal.c @@ -46,7 +46,7 @@ signame(int32 sig) { if(sig < 0 || sig >= NSIG) return emptystring; - return gostring((byte*)sigtab[sig].name); + return gostringnocopy((byte*)sigtab[sig].name); } void diff --git a/src/pkg/runtime/linux/arm/signal.c b/src/pkg/runtime/linux/arm/signal.c index 4d315cc80..68d10ea65 100644 --- a/src/pkg/runtime/linux/arm/signal.c +++ b/src/pkg/runtime/linux/arm/signal.c @@ -46,7 +46,7 @@ signame(int32 sig) { if(sig < 0 || sig >= NSIG) return emptystring; - return gostring((byte*)sigtab[sig].name); + return gostringnocopy((byte*)sigtab[sig].name); } void diff --git a/src/pkg/runtime/runtime.c b/src/pkg/runtime/runtime.c index 67b8b9725..e83006c19 100644 --- a/src/pkg/runtime/runtime.c +++ b/src/pkg/runtime/runtime.c @@ -79,7 +79,7 @@ panicstring(int8 *s) { Eface err; - ·newErrorString(gostring((byte*)s), &err); + ·newErrorString(gostringnocopy((byte*)s), &err); ·panic(err); } @@ -161,13 +161,13 @@ goargs(void) genvv = malloc(envc*sizeof genvv[0]); for(i=0; i<argc; i++) - gargv[i] = gostring(argv[i]); + gargv[i] = gostringnocopy(argv[i]); os·Args.array = (byte*)gargv; os·Args.len = argc; os·Args.cap = argc; for(i=0; i<envc; i++) - genvv[i] = gostring(argv[argc+1+i]); + genvv[i] = gostringnocopy(argv[argc+1+i]); os·Envs.array = (byte*)genvv; os·Envs.len = envc; os·Envs.cap = envc; @@ -220,7 +220,7 @@ void byte *p; p = getenv("GOROOT"); - out = gostring(p); + out = gostringnocopy(p); FLUSH(&out); } diff --git a/src/pkg/runtime/runtime.h b/src/pkg/runtime/runtime.h index 9c08796ed..1bce98e25 100644 --- a/src/pkg/runtime/runtime.h +++ b/src/pkg/runtime/runtime.h @@ -387,6 +387,7 @@ void* mal(uintptr); uint32 cmpstring(String, String); String catstring(String, String); String gostring(byte*); +String gostringnocopy(byte*); String gostringw(uint16*); void initsig(void); int32 gotraceback(void); diff --git a/src/pkg/runtime/string.goc b/src/pkg/runtime/string.goc index 103ac329b..1a4847322 100644 --- a/src/pkg/runtime/string.goc +++ b/src/pkg/runtime/string.goc @@ -61,6 +61,16 @@ gostring(byte *str) } String +gostringnocopy(byte *str) +{ + String s; + + s.str = str; + s.len = findnull(str); + return s; +} + +String gostringw(uint16 *str) { int32 n, i; diff --git a/src/pkg/runtime/symtab.c b/src/pkg/runtime/symtab.c index 0284c9f01..5a35f635b 100644 --- a/src/pkg/runtime/symtab.c +++ b/src/pkg/runtime/symtab.c @@ -106,7 +106,7 @@ dofunc(Sym *sym) break; } f = &func[nfunc++]; - f->name = gostring(sym->name); + f->name = gostringnocopy(sym->name); f->entry = sym->value; if(sym->symtype == 'L' || sym->symtype == 'l') f->frame = -sizeof(uintptr); |