From: Ken Thompson Date: Thu, 23 Oct 2008 00:25:10 +0000 (-0700) Subject: embedded types X-Git-Tag: weekly.2009-11-06~2913 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=6fecb76eea5c680b58ec64f54ba0048ef5edac66;p=gostls13.git embedded types R=r OCL=17676 CL=17676 --- diff --git a/src/cmd/gc/go.y b/src/cmd/gc/go.y index 5a7eae468e..7c2bd4ae0d 100644 --- a/src/cmd/gc/go.y +++ b/src/cmd/gc/go.y @@ -1855,7 +1855,11 @@ hidden_structdcl: } | '?' hidden_type { - $$ = embedded($2->sym); + if(isptr[$2->etype]) { + $$ = embedded($2->type->sym); + $$->type = ptrto($$->type); + } else + $$ = embedded($2->sym); } hidden_interfacedcl: diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c index 25f5d79d00..f8eb2e8a8a 100644 --- a/src/cmd/gc/walk.c +++ b/src/cmd/gc/walk.c @@ -3224,6 +3224,8 @@ loop: goto loop; } +static int prdot = 0; + int lookdot0(Sym *s, Type *t) { @@ -3240,11 +3242,21 @@ lookdot0(Sym *s, Type *t) if(f->sym == s) c++; } -//BOTCH need method + u = methtype(t); + if(u != T) { + for(f=u->method; f!=T; f=f->down) + if(f->sym == s) +{ +if(prdot) +print("found method %S\n", s); + c++; +} + } return c; } -static Node* dotlist; +enum { maxembed = 10 }; // max depth search for embedded types +static Sym* dotlist[maxembed+1]; // maxembed..1 int adddot1(Sym *s, Type *t, int d) @@ -3268,10 +3280,8 @@ adddot1(Sym *s, Type *t, int d) if(f->sym == S) continue; a = adddot1(s, f->type, d-1); - if(a != 0 && c == 0) { - dotlist = nod(ODOT, dotlist, N); - dotlist->type = f; - } + if(a != 0 && c == 0) + dotlist[d] = f->sym; c += a; } return c; @@ -3296,23 +3306,33 @@ adddot(Node *n) if(s == S) return n; - dotlist = N; - for(d=0; d<5; d++) { + for(d=0; d 0) goto out; } +if(prdot) { +print("missed"); +dump("", n); +} return n; out: if(c > 1) yyerror("ambiguous DOT reference %S", s); +if(prdot) +if(d > 0) +print("add dots:"); // rebuild elided dots - for(l=dotlist; l!=N; l=l->left) { + for(c=d; c>0; c--) { n = nod(ODOT, n, n->right); - n->left->right = newname(l->type->sym); + n->left->right = newname(dotlist[c]); +if(prdot) +print(" %S", dotlist[c]); } - +if(prdot) +if(d > 0) +print("\n"); return n; }