]> Cypherpunks repositories - gostls13.git/commitdiff
disallow P.t for lowercase t and not our package P.
authorRuss Cox <rsc@golang.org>
Wed, 21 Jan 2009 22:51:57 +0000 (14:51 -0800)
committerRuss Cox <rsc@golang.org>
Wed, 21 Jan 2009 22:51:57 +0000 (14:51 -0800)
implement hiding lowercase methods m in
signatures by adding in a hash of the package name
to the type hash code.

remove remaining checks for internally-generated _ names:
they are all gone.

R=ken
OCL=23236
CL=23238

src/cmd/6g/gen.c
src/cmd/6g/obj.c
src/cmd/gc/dcl.c
src/cmd/gc/go.h
src/cmd/gc/lex.c
src/cmd/gc/subr.c
src/runtime/iface.c
test/golden.out

index 121fb057bad9bc78c5ea2813b7a2e7da2145fae5..769a72b8f2b24d40bde722b14d622abeabb6f84f 100644 (file)
@@ -57,9 +57,8 @@ if(throwreturn == N) {
                // add clearing of the output parameters
                t = structfirst(&save, getoutarg(curfn->type));
                while(t != T) {
-                       if(t->nname != N && t->nname->sym->name[0] != '_') {
+                       if(t->nname != N)
                                curfn->nbody = list(nod(OAS, t->nname, N), curfn->nbody);
-                       }
                        t = structnext(&save);
                }
        }
index fb2d382a3cd7154112d5a45fa6fc3e2205732991..76c6a93e2817d57d2f53ff5190409720e234d141 100644 (file)
@@ -658,6 +658,8 @@ dumpsigt(Type *progt, Type *ifacet, Type *rcvrt, Type *methodt, Sym *s)
 
                a->name = method->name;
                a->hash = PRIME8*stringhash(a->name) + PRIME9*typehash(f->type, 0);
+               if(!exportname(a->name))
+                       a->hash += PRIME10*stringhash(package);
                a->perm = o;
                a->sym = methodsym(method, rcvrt);
 
@@ -767,7 +769,6 @@ dumpsigi(Type *t, Sym *s)
        int o;
        Sig *a, *b;
        Prog *p;
-       char *sp;
        char buf[NSYMB];
 
        at.sym = s;
@@ -784,19 +785,15 @@ dumpsigi(Type *t, Sym *s)
                s1 = f->sym;
                if(s1 == nil)
                        continue;
-               if(s1->name[0] == '_')
-                       continue;
 
                b = mal(sizeof(*b));
                b->link = a;
                a = b;
 
                a->name = s1->name;
-               sp = strchr(s1->name, '_');
-               if(sp != nil)
-                       a->name = sp+1;
-
                a->hash = PRIME8*stringhash(a->name) + PRIME9*typehash(f->type, 0);
+               if(!exportname(a->name))
+                       a->hash += PRIME10*stringhash(package);
                a->perm = o;
                a->sym = methodsym(f->sym, t);
                a->offset = 0;
index d25ab33284d9177f46be49dc1acf961d554eb961..12123b4a5e799027ed1a664dc7151703f408eb7c 100644 (file)
@@ -433,7 +433,7 @@ funcargs(Type *ft)
        while(t != T) {
                if(t->nname != N)
                        t->nname->xoffset = t->width;
-               if(t->nname != N && t->nname->sym->name[0] != '_') {
+               if(t->nname != N) {
                        addvar(t->nname, t->type, PPARAM);
                        all |= 1;
                } else
index fceb743deace9b38a29c90b6aace967c6b551ef8..b04790d662954ed3c8d18d9e18e4d43e2578719a 100644 (file)
@@ -34,6 +34,7 @@ enum
        PRIME7          = 10067,
        PRIME8          = 10079,
        PRIME9          = 10091,
+       PRIME10         = 10093,
 
        AUNK            = 100,
        // these values are known by runtime
index c3a6511c9afecab17f96b3088d947a0807006529..83fc1f8d398823f0fec01b6a398b1865ede92b5a 100644 (file)
@@ -685,6 +685,8 @@ talph:
                s = pkglookup(s->name, context);
                if(s->lexical == LIGNORE)
                        goto l0;
+               if(!exportname(s->name) && strcmp(package, s->opackage) != 0)
+                       s = pkglookup(s->name, ".private");
        }
 
        DBG("lex: %S %s\n", s, lexname(s->lexical));
index 40912bce675ea0ceeec8bb63c74c2b9b7dce04e2..0650a634e30dfd10815a1acec8a0b0ecf2c4609f 100644 (file)
@@ -1683,12 +1683,8 @@ eqtype(Type *t1, Type *t2, int d)
                        if(t1->nname != N && t1->nname->sym != S) {
                                if(t2->nname == N || t2->nname->sym == S)
                                        return 0;
-                               if(strcmp(t1->nname->sym->name, t2->nname->sym->name) != 0) {
-                                       // assigned names dont count
-                                       if(t1->nname->sym->name[0] != '_' ||
-                                          t2->nname->sym->name[0] != '_')
-                                               return 0;
-                               }
+                               if(strcmp(t1->nname->sym->name, t2->nname->sym->name) != 0)
+                                       return 0;
                        }
                        t1 = t1->down;
                        t2 = t2->down;
@@ -2489,7 +2485,7 @@ expand0(Type *t)
        u = methtype(t);
        if(u != T) {
                for(f=u->method; f!=T; f=f->down) {
-                       if(!exportname(f->sym->name) && strcmp(f->sym->package, package) != 0)
+                       if(!exportname(f->sym->name) && strcmp(f->sym->opackage, package) != 0)
                                continue;
                        if(f->sym->uniq)
                                continue;
index 832f1572634f6e4318d8f1a43720cc4a9be39f68..70e2b4f04c042f6dbf3b7a431837efe88fad2aac 100644 (file)
@@ -168,6 +168,13 @@ throw:
                                        prints(": missing method ");
                                        prints((int8*)iname);
                                        prints("\n");
+                                       if(iface_debug) {
+                                               prints("interface");
+                                               printsigi(si);
+                                               prints("\ntype");
+                                               printsigt(st);
+                                               prints("\n");
+                                       }
                                        throw("interface conversion");
                                }
                                m->bad = 1;
index 889b421818a5bd050b303e4f82641b110d9f46e5..023b96edd04c99807461bede9fbfdf0c4a92b571 100644 (file)
@@ -232,7 +232,7 @@ fixedbugs/bug074.go:7: x: undefined
 fixedbugs/bug081.go:5: no type x
 
 =========== fixedbugs/bug083.go
-BUG: succeeds incorrectly
+fixedbugs/bug083.dir/bug1.go:9: syntax error near t0
 
 =========== fixedbugs/bug086.go
 fixedbugs/bug086.go:5: function ends without a return statement