From 4843b130bbc67b5b33f20d612a992131735ec2b4 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Wed, 19 May 2010 21:33:31 -0700 Subject: [PATCH] runtime: avoid allocation for fixed strings R=r CC=golang-dev https://golang.org/cl/1083041 --- src/pkg/runtime/darwin/386/signal.c | 2 +- src/pkg/runtime/darwin/amd64/signal.c | 2 +- src/pkg/runtime/freebsd/386/signal.c | 2 +- src/pkg/runtime/freebsd/amd64/signal.c | 2 +- src/pkg/runtime/iface.c | 4 ++-- src/pkg/runtime/linux/386/signal.c | 2 +- src/pkg/runtime/linux/amd64/signal.c | 2 +- src/pkg/runtime/linux/arm/signal.c | 2 +- src/pkg/runtime/runtime.c | 8 ++++---- src/pkg/runtime/runtime.h | 1 + src/pkg/runtime/string.goc | 10 ++++++++++ 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 5161796dc3..7c0c381d37 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 56f02e56dc..8145e8d8f4 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 be2f4ce6ff..44a868e353 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 b0ac650a3b..e153752db7 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 9c2c6b1b5e..55a1362c61 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 8c76ec366a..2d8ad57b2a 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 fbe6599f6c..1dfeb5f051 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 4d315cc808..68d10ea65a 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 67b8b9725e..e83006c19d 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; iname = gostring(sym->name); + f->name = gostringnocopy(sym->name); f->entry = sym->value; if(sym->symtype == 'L' || sym->symtype == 'l') f->frame = -sizeof(uintptr);