int c, d, o;
Prog *p;
Type *f;
+ Sym *msym;
e = lookup(b->name);
for(d=0; d<nelem(dotlist); d++) {
f = dotlist[0].field;
//JMP main·Sub_test2(SB)
- snprint(namebuf, sizeof(namebuf), "%s_%s",
- f->sym->name, b->name);
if(isptr[f->type->etype])
f = f->type;
p = pc;
gins(AJMP, N, N);
p->to.type = D_EXTERN;
- p->to.sym = pkglookup(namebuf, f->type->sym->opackage);
+ p->to.sym = methodsym(lookup(b->name), f->type);
//print("6. %P\n", p);
}
a->name = s1->name;
a->hash = PRIME8*stringhash(a->name) + PRIME9*typehash(f->type, 0);
a->perm = o;
- snprint(namebuf, sizeof(namebuf), "%s_%s",
- at.sym->name+5, f->sym->name);
- a->sym = lookup(namebuf);
+ a->sym = methodsym(f->sym, t);
a->offset = f->embedded; // need trampoline
o++;
a->hash = PRIME8*stringhash(a->name) + PRIME9*typehash(f->type, 0);
a->perm = o;
- snprint(namebuf, sizeof(namebuf), "%s_%s",
- at.sym->name+5, f->sym->name);
- a->sym = lookup(namebuf);
+ a->sym = methodsym(f->sym, t);
a->offset = 0;
o++;
return 1;
}
-Node*
-methodname(Node *n, Type *t)
+Sym*
+methodsym(Sym *nsym, Type *t)
{
Sym *s;
char buf[NSYMB];
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);
}
/*
{
Type *f;
Iter save;
- char buf[100];
String *note;
n = listfirst(&save, &n);
{
Dcl *r, *d;
Sym *s;
- char *p;
static int typgen;
if(n==T || n->sym == S)
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)
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)
Type* method;
Sym* sym;
- Sym* xsym; // export sym
int32 vargen; // unique name for OTYPE/ONAME
Node* nname;
Val val;
Sym* osym; // import
- Sym* fsym; // import
Sym* psym; // import
Sym* sym; // various
int32 vargen; // unique name for OTYPE/ONAME
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*);
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);
}
int et;
Sym *s;
char buf[NSYMB];
- char *glob;
+ char *sigx;
if(t == T)
return S;
- glob = "sys";
et = t->etype;
switch(et) {
default:
case TINTER:
case TDDD:
if(isnilinter(t)) {
- snprint(buf, sizeof(buf), "%s_%s", "sigi", "inter");
+ sigx = "sigi";
+ strcpy(buf, "inter");
goto out;
}
return S;
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];
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;
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];
{
Type *t;
Sym *s;
- Node *l;
int c, d;
walktype(n->left, Erv);
#define END nil,0,0,nil
-Sigi sys·sigi_inter[2] = { (byte*)"interface {}", 0, 0, nil, 0, 0 };
+Sigi sigi·inter[2] = { (byte*)"interface {}", 0, 0, nil, 0, 0 };
-Sigt sys·sigt_int8[2] = { (byte*)"int8", ASIMP, 1, nil, END };
-Sigt sys·sigt_int16[2] = { (byte*)"int16", ASIMP, 2, nil, END };
-Sigt sys·sigt_int32[2] = { (byte*)"int32", ASIMP, 4, nil, END };
-Sigt sys·sigt_int64[2] = { (byte*)"int64", ASIMP, 8, nil, END };
+Sigt sigt·int8[2] = { (byte*)"int8", ASIMP, 1, nil, END };
+Sigt sigt·int16[2] = { (byte*)"int16", ASIMP, 2, nil, END };
+Sigt sigt·int32[2] = { (byte*)"int32", ASIMP, 4, nil, END };
+Sigt sigt·int64[2] = { (byte*)"int64", ASIMP, 8, nil, END };
-Sigt sys·sigt_uint8[2] = { (byte*)"uint8", ASIMP, 1, nil, END };
-Sigt sys·sigt_uint16[2] = { (byte*)"uint16", ASIMP, 2, nil, END };
-Sigt sys·sigt_uint32[2] = { (byte*)"uint32", ASIMP, 4, nil, END };
-Sigt sys·sigt_uint64[2] = { (byte*)"uint64", ASIMP, 8, nil, END };
+Sigt sigt·uint8[2] = { (byte*)"uint8", ASIMP, 1, nil, END };
+Sigt sigt·uint16[2] = { (byte*)"uint16", ASIMP, 2, nil, END };
+Sigt sigt·uint32[2] = { (byte*)"uint32", ASIMP, 4, nil, END };
+Sigt sigt·uint64[2] = { (byte*)"uint64", ASIMP, 8, nil, END };
-Sigt sys·sigt_float32[2] = { (byte*)"float32", ASIMP, 4, nil, END };
-Sigt sys·sigt_float64[2] = { (byte*)"float64", ASIMP, 8, nil, END };
-//Sigt sys·sigt_float80[2] = { (byte*)"float80", ASIMP, 0, nil, END };
+Sigt sigt·float32[2] = { (byte*)"float32", ASIMP, 4, nil, END };
+Sigt sigt·float64[2] = { (byte*)"float64", ASIMP, 8, nil, END };
+//Sigt sigt·float80[2] = { (byte*)"float80", ASIMP, 0, nil, END };
-Sigt sys·sigt_bool[2] = { (byte*)"bool", ASIMP, 1, nil, END };
-Sigt sys·sigt_string[2] = { (byte*)"string", ASTRING, 8, nil, END };
+Sigt sigt·bool[2] = { (byte*)"bool", ASIMP, 1, nil, END };
+Sigt sigt·string[2] = { (byte*)"string", ASTRING, 8, nil, END };
-Sigt sys·sigt_int[2] = { (byte*)"int", ASIMP, 4, nil, END };
-Sigt sys·sigt_uint[2] = { (byte*)"uint", ASIMP, 4, nil, END };
-Sigt sys·sigt_uintptr[2] = { (byte*)"uintptr", ASIMP, 8, nil, END };
-Sigt sys·sigt_float[2] = { (byte*)"float", ASIMP, 4, nil, END };
+Sigt sigt·int[2] = { (byte*)"int", ASIMP, 4, nil, END };
+Sigt sigt·uint[2] = { (byte*)"uint", ASIMP, 4, nil, END };
+Sigt sigt·uintptr[2] = { (byte*)"uintptr", ASIMP, 8, nil, END };
+Sigt sigt·float[2] = { (byte*)"float", ASIMP, 4, nil, END };
static void
printsigi(Sigi *si)
hello, world
=========== ./interface2.go
-cannot convert type *main.S_interface2 to interface main.I_interface2: missing method Foo
+cannot convert type *main.S·interface2 to interface main.I·interface2: missing method Foo
throw: interface conversion
SIGSEGV: segmentation violation
Faulting address: 0x0
=========== ./interface3.go
-cannot convert type *main.S_interface3 to interface main.I2_interface3: missing method Name
+cannot convert type *main.S·interface3 to interface main.I2·interface3: missing method Name
throw: interface conversion
SIGSEGV: segmentation violation
Faulting address: 0x0