]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: avoid allocation for fixed strings
authorRuss Cox <rsc@golang.org>
Thu, 20 May 2010 04:33:31 +0000 (21:33 -0700)
committerRuss Cox <rsc@golang.org>
Thu, 20 May 2010 04:33:31 +0000 (21:33 -0700)
R=r
CC=golang-dev
https://golang.org/cl/1083041

12 files changed:
src/pkg/runtime/darwin/386/signal.c
src/pkg/runtime/darwin/amd64/signal.c
src/pkg/runtime/freebsd/386/signal.c
src/pkg/runtime/freebsd/amd64/signal.c
src/pkg/runtime/iface.c
src/pkg/runtime/linux/386/signal.c
src/pkg/runtime/linux/amd64/signal.c
src/pkg/runtime/linux/arm/signal.c
src/pkg/runtime/runtime.c
src/pkg/runtime/runtime.h
src/pkg/runtime/string.goc
src/pkg/runtime/symtab.c

index 5161796dc3f190286c53ae74c6b08d755866dfc3..7c0c381d3716c481a529f78bdbcde452cc8b0644 100644 (file)
@@ -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
index 56f02e56dc5fee95a74937e89c82c4b2bb435ae3..8145e8d8f450ac54337f88c7b9404336d92a1627 100644 (file)
@@ -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
index be2f4ce6ffaa4da2734f189537db31bbf2abc7e7..44a868e35314ff338454c7d5bd7fdf292fd86cac 100644 (file)
@@ -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
index b0ac650a3bf4053b66015b1c03fc9bd1080fba9a..e153752db7a001c55a775219d2c65e5952304095 100644 (file)
@@ -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
index 9c2c6b1b5e7478c6fda4fa4232ba109ec4fa61a0..55a1362c6135ce035be05a13c8118ece62dec24e 100644 (file)
@@ -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);
        }
 
index 8c76ec366affbfc9375c7693cce6cdd946e3c6ce..2d8ad57b2ac94689dd3d24e4108cb0b0a979a6be 100644 (file)
@@ -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
index fbe6599f6c9a3fe7bfe07084d4d6c0df0a1d82cd..1dfeb5f0519d645fd3131f2963a12b7b41a4f3bf 100644 (file)
@@ -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
index 4d315cc808c154e793918052d8e61690043ab794..68d10ea65af52157950b9e029a016b1f9737c054 100644 (file)
@@ -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
index 67b8b9725e1b522e14c2ffd05a4ed4fb09f5ca56..e83006c19dceadc821221710a6f228973fc07bc5 100644 (file)
@@ -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);
 }
 
index 9c08796ed36093da2e29d0d23188c2eb2fc8faf1..1bce98e256e188c4cdd236ec2cbe7489b0246200 100644 (file)
@@ -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);
index 103ac329b4e0889fb39a06e86cf5849e746b5fcf..1a4847322167c62fe1aa9aa5500ddcf7a52f400e 100644 (file)
@@ -60,6 +60,16 @@ gostring(byte *str)
        return s;
 }
 
+String
+gostringnocopy(byte *str)
+{
+       String s;
+       
+       s.str = str;
+       s.len = findnull(str);
+       return s;
+}
+
 String
 gostringw(uint16 *str)
 {
index 0284c9f0198c5562d104f4a54c034caa11902307..5a35f635b792fd7abc83d98e5a88bfe1422c5cd1 100644 (file)
@@ -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);