summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2010-05-19 21:33:31 -0700
committerRuss Cox <rsc@golang.org>2010-05-19 21:33:31 -0700
commitef9b8a7bec35c6c2389333a23229686c5ad388c2 (patch)
tree8690e50b84b38c5b588ddd6b8faf1c047f823935
parentdadb8fa07dc0481da3be7ced999b6344b6643139 (diff)
downloadgolang-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.c2
-rw-r--r--src/pkg/runtime/darwin/amd64/signal.c2
-rw-r--r--src/pkg/runtime/freebsd/386/signal.c2
-rw-r--r--src/pkg/runtime/freebsd/amd64/signal.c2
-rw-r--r--src/pkg/runtime/iface.c4
-rw-r--r--src/pkg/runtime/linux/386/signal.c2
-rw-r--r--src/pkg/runtime/linux/amd64/signal.c2
-rw-r--r--src/pkg/runtime/linux/arm/signal.c2
-rw-r--r--src/pkg/runtime/runtime.c8
-rw-r--r--src/pkg/runtime/runtime.h1
-rw-r--r--src/pkg/runtime/string.goc10
-rw-r--r--src/pkg/runtime/symtab.c2
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);