]> Cypherpunks repositories - gostls13.git/commitdiff
embedded types
authorKen Thompson <ken@golang.org>
Thu, 23 Oct 2008 00:25:10 +0000 (17:25 -0700)
committerKen Thompson <ken@golang.org>
Thu, 23 Oct 2008 00:25:10 +0000 (17:25 -0700)
R=r
OCL=17676
CL=17676

src/cmd/gc/go.y
src/cmd/gc/walk.c

index 5a7eae468e58bbaf93cd2f84574d0aa63a1008df..7c2bd4ae0dd85a892ed08f8d6b55d03625e2c358 100644 (file)
@@ -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:
index 25f5d79d004c86cc202f0b1667f98833e1f7c4a9..f8eb2e8a8ac0a06f00019bcf6170c32bc812dd46 100644 (file)
@@ -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<maxembed; d++) {
                c = adddot1(s, t, d);
                if(c > 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;
 }