From: Russ Cox Date: Fri, 3 Apr 2009 01:32:57 +0000 (-0700) Subject: use _f007·filename for func literals. X-Git-Tag: weekly.2009-11-06~1901 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=416b27548ed2c6ac89c28c192880900cbc2ffa6d;p=gostls13.git use _f007·filename for func literals. this avoids problems people have run into with multiple closures in the same package. when preparing filename, only cut off .go, not .anything. this fixes a bug tgs ran into with foo.pb.go and foo.go in the same package. also turn bad identifier chars from filename into underscores: a-b.pb.go => a_b_pb R=ken OCL=27050 CL=27050 --- diff --git a/src/cmd/gc/dcl.c b/src/cmd/gc/dcl.c index 2e467249bb..51c76be752 100644 --- a/src/cmd/gc/dcl.c +++ b/src/cmd/gc/dcl.c @@ -583,7 +583,7 @@ funclit1(Type *type, Node *body) // declare function. vargen++; - snprint(namebuf, sizeof(namebuf), "_f%.3ld", vargen); + snprint(namebuf, sizeof(namebuf), "_f%.3ld·%s", vargen, filename); f = newname(lookup(namebuf)); addvar(f, ft, PFUNC); f->funcdepth = 0; diff --git a/src/cmd/gc/lex.c b/src/cmd/gc/lex.c index 3477a2cffc..4e577a63c8 100644 --- a/src/cmd/gc/lex.c +++ b/src/cmd/gc/lex.c @@ -138,15 +138,23 @@ void setfilename(char *file) { char *p; + int c; p = strrchr(file, '/'); if(p != nil) file = p+1; strncpy(namebuf, file, sizeof(namebuf)); - p = strchr(namebuf, '.'); - if(p != nil) + p = strrchr(namebuf, '.'); + if(p != nil && strcmp(p, ".go") == 0) *p = 0; filename = strdup(namebuf); + + // turn invalid identifier chars into _ + for(p=filename; *p; p++) { + c = *p & 0xFF; + if(c < 0x80 && !isalpha(c) && !isdigit(c) && c != '_') + *p = '_'; + } } int