rename various magic names.
sigi and sigt:
sys·sigi_inter -> sigi·inter
sys·sigt_int -> sigt·int
Package·sigt_Type -> sigt·Package.Type
local type T in file x.go T_x -> T·x
second one T_x_1 -> T·x·1
method names M on T T_M -> T·M
correctly handle local embedded types
init functions are the only place left that use underscores
R=ken
OCL=18377
CL=18377
diff --git a/src/cmd/gc/dcl.c b/src/cmd/gc/dcl.c
index f88d2ab..3fb7710 100644
--- a/src/cmd/gc/dcl.c
+++ b/src/cmd/gc/dcl.c
@@ -200,8 +200,8 @@
return 1;
}
-Node*
-methodname(Node *n, Type *t)
+Sym*
+methodsym(Sym *nsym, Type *t)
{
Sym *s;
char buf[NSYMB];
@@ -213,12 +213,24 @@
if(s == S)
goto bad;
- snprint(buf, sizeof(buf), "%s_%s", s->name, n->sym->name);
- return newname(pkglookup(buf, s->opackage));
+ snprint(buf, sizeof(buf), "%#hT·%s", t, nsym->name);
+//print("methodname %s\n", buf);
+ return pkglookup(buf, s->opackage);
bad:
yyerror("illegal <this> type: %T", t);
- return n;
+ return S;
+}
+
+Node*
+methodname(Node *n, Type *t)
+{
+ Sym *s;
+
+ s = methodsym(n->sym, t);
+ if(s == S)
+ return n;
+ return newname(s);
}
/*
@@ -449,7 +461,6 @@
{
Type *f;
Iter save;
- char buf[100];
String *note;
n = listfirst(&save, &n);
@@ -740,7 +751,6 @@
{
Dcl *r, *d;
Sym *s;
- char *p;
static int typgen;
if(n==T || n->sym == S)
@@ -753,9 +763,7 @@
else {
r = autodcl;
pushdcl(s);
- p = smprint("%s_%d", s->name, ++typgen);
- n->xsym = lookup(p);
- free(p);
+ n->vargen = ++typgen;
}
if(s->tblock == block)
@@ -1168,8 +1176,19 @@
embedded(Sym *s)
{
Node *n;
+ char *name;
+
+ // Names sometimes have disambiguation junk
+ // appended after a center dot. Discard it when
+ // making the name for the embedded struct field.
+ enum { CenterDot = 0xB7 };
+ name = s->name;
+ if(utfrune(s->name, CenterDot)) {
+ name = strdup(s->name);
+ *utfrune(name, CenterDot) = 0;
+ }
- n = newname(lookup(s->name));
+ n = newname(lookup(name));
n = nod(ODCLFIELD, n, N);
n->embedded = 1;
if(s == S)
diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h
index 314333f..025edaa 100644
--- a/src/cmd/gc/go.h
+++ b/src/cmd/gc/go.h
@@ -135,7 +135,6 @@
Type* method;
Sym* sym;
- Sym* xsym; // export sym
int32 vargen; // unique name for OTYPE/ONAME
Node* nname;
@@ -190,7 +189,6 @@
Val val;
Sym* osym; // import
- Sym* fsym; // import
Sym* psym; // import
Sym* sym; // various
int32 vargen; // unique name for OTYPE/ONAME
@@ -665,6 +663,7 @@
int listcount(Node*);
void addmethod(Node*, Type*, int);
Node* methodname(Node*, Type*);
+Sym* methodsym(Sym*, Type*);
Type* functype(Node*, Node*, Node*);
char* thistypenam(Node*);
void funcnam(Type*, char*);
diff --git a/src/cmd/gc/subr.c b/src/cmd/gc/subr.c
index 9da4738..15650c8 100644
--- a/src/cmd/gc/subr.c
+++ b/src/cmd/gc/subr.c
@@ -984,12 +984,17 @@
if(t == types[t->etype] || t == types[TSTRING])
return fmtprint(fp, "%s", s->name);
if(exporting) {
- if(t->xsym != S)
- s = t->xsym;
+ if(fp->flags & FmtShort)
+ fmtprint(fp, "%hS", s);
+ else
+ fmtprint(fp, "%lS", s);
if(strcmp(s->opackage, package) == 0)
- if(s->otype != t || !s->export)
- return fmtprint(fp, "%lS_%s", s, filename);
- return fmtprint(fp, "%lS", s);
+ if(s->otype != t || !s->export) {
+ fmtprint(fp, "·%s", filename);
+ if(t->vargen)
+ fmtprint(fp, "·%d", t->vargen);
+ }
+ return 0;
}
return fmtprint(fp, "%S", s);
}
@@ -1606,12 +1611,11 @@
int et;
Sym *s;
char buf[NSYMB];
- char *glob;
+ char *sigx;
if(t == T)
return S;
- glob = "sys";
et = t->etype;
switch(et) {
default:
@@ -1620,7 +1624,8 @@
case TINTER:
case TDDD:
if(isnilinter(t)) {
- snprint(buf, sizeof(buf), "%s_%s", "sigi", "inter");
+ sigx = "sigi";
+ strcpy(buf, "inter");
goto out;
}
return S;
@@ -1660,10 +1665,11 @@
return S;
if(strcmp(t->sym->name, types[et]->sym->name) != 0)
return S;
- snprint(buf, sizeof(buf), "%s_%S", "sigt", t->sym);
+ sigx = "sigt";
+ snprint(buf, sizeof(buf), "%#T", t);
out:
- s = pkglookup(buf, glob);
+ s = pkglookup(buf, sigx);
if(s->oname == N) {
s->oname = newname(s);
s->oname->type = types[TUINT8];
@@ -1709,8 +1715,6 @@
block = s->tblock;
if(block > 1) {
- snprint(buf, sizeof(buf), "%s_%d%s", e, block, s->name);
-
// record internal type for signature generation
x = mal(sizeof(*x));
x->op = OTYPE;
@@ -1719,10 +1723,9 @@
x->forw = signatlist;
x->block = block;
signatlist = x;
- } else
- snprint(buf, sizeof(buf), "%s_%s", e, s->name);
-
- ss = pkglookup(buf, s->opackage);
+ }
+ snprint(buf, sizeof(buf), "%#T", t);
+ ss = pkglookup(buf, e);
if(ss->oname == N) {
ss->oname = newname(ss);
ss->oname->type = types[TUINT8];
@@ -2494,7 +2497,6 @@
{
Type *t;
Sym *s;
- Node *l;
int c, d;
walktype(n->left, Erv);