]> Cypherpunks repositories - gostls13.git/commitdiff
more export
authorKen Thompson <ken@golang.org>
Wed, 24 Sep 2008 21:12:21 +0000 (14:12 -0700)
committerKen Thompson <ken@golang.org>
Wed, 24 Sep 2008 21:12:21 +0000 (14:12 -0700)
R=r
OCL=15771
CL=15771

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

index 627d0058736af53d332c3813f5d10a7ef18883a9..8bc326ebbc60bf759dc1cbf207045e742d2a0e52 100644 (file)
@@ -28,15 +28,11 @@ exportsym(Sym *s)
 }
 
 void
-reexport(Type *t)
+makeexportsym(Type *t)
 {
        Sym *s;
 
-       if(t == T)
-               fatal("reexport: type nil");
-
-       s = t->sym;
-       if(s == S/* || s->name[0] == '_'*/) {
+       if(t->sym == S) {
                exportgen++;
                snprint(namebuf, sizeof(namebuf), "_e%s_%.3ld", filename, exportgen);
                s = lookup(namebuf);
@@ -44,6 +40,18 @@ reexport(Type *t)
                s->otype = t;
                t->sym = s;
        }
+}
+
+void
+reexport(Type *t)
+{
+       Sym *s;
+
+       if(t == T)
+               fatal("reexport: type nil");
+
+       makeexportsym(t);
+       s = t->sym;
        dumpexporttype(s);
 }
 
@@ -164,14 +172,17 @@ dumpexporttype(Sym *s)
 
        case TPTR32:
        case TPTR64:
-               if(t->type != T && t->type->sym == S)
-                       reexport(t->type);
+               if(t->type == T)
+                       fatal("dumpexporttype: ptr %S", s);
+               makeexportsym(t->type); /* forw declare */
 
                /* type 6 */
                Bprint(bout, "\ttype ");
                if(s->export != 0)
                        Bprint(bout, "!");
                Bprint(bout, "%lS *%lS\n", s, t->type->sym);
+
+               reexport(t->type);
                break;
 
        case TFUNC:
@@ -220,7 +231,7 @@ dumpexporttype(Sym *s)
                reexport(t->type);
                reexport(t->down);
 
-               /* type 6 */
+               /* type 1 */
                Bprint(bout, "\ttype ");
                if(s->export != 0)
                        Bprint(bout, "!");
@@ -323,6 +334,50 @@ dumpexport(void)
 /*
  * ******* import *******
  */
+
+void
+checkimports(void)
+{
+       Sym *s;
+       Type *t, *t1;
+       uint32 h;
+       int et;
+
+       for(h=0; h<NHASH; h++)
+       for(s = hash[h]; s != S; s = s->link) {
+               t = s->otype;
+               if(t == T)
+                       continue;
+
+               et = t->etype;
+               switch(t->etype) {
+               case TFORW:
+                       print("ci-1: %S %lT\n", s, t);
+                       break;
+
+               case TPTR32:
+               case TPTR64:
+                       if(t->type == T) {
+                               print("ci-2: %S %lT\n", s, t);
+                               break;
+                       }
+
+                       t1 = t->type;
+                       if(t1 == T) {
+                               print("ci-3: %S %lT\n", s, t1);
+                               break;
+                       }
+
+                       et = t1->etype;
+                       if(et == TFORW) {
+                               print("%L: ci-4: %S %lT\n", lineno, s, t);
+                               break;
+                       }
+                       break;
+               }
+       }
+}
+
 void
 renamepkg(Node *n)
 {
@@ -451,21 +506,13 @@ importaddtyp(Node *ss, Type *t)
        Sym *s;
 
        s = getimportsym(ss);
-       if(ss->etype){  // exported
-               if(s->otype == T || !eqtype(t, s->otype, 0)) {
-                       if(s->otype != T)
-                               print("redeclaring %S %lT => %lT\n", s, s->otype, t);
-                       addtyp(newtype(s), t, PEXTERN);
-                       /*
-                        * mark as export to avoid conflicting export bits
-                        * in multi-file package.
-                        */
-                       s->export = 1;
-               }
-       }else{
+       if(s->otype != T && !eqtype(t, s->otype, 0)) {
+               yyerror("import redeclaration of %S %lT => %lT\n", s, s->otype, t);
                s->otype = t;
-               t->sym = s;
        }
+
+       if(s->otype == T)
+               addtyp(newtype(s), t, PEXTERN);
 }
 
 /*
index d17f1fc6cb9a3f155a0c7178f018ec45cd17d4a1..049b977192ae50d45eee56781667a4d630a1a02a 100644 (file)
@@ -129,9 +129,13 @@ import_package:
 import_there:
        hidden_import_list_r ')' ')'
        {
+               checkimports();
                unimportfile();
        }
 |      LIMPORT '(' '(' hidden_import_list_r ')' ')'
+       {
+               checkimports();
+       }
 
 /*
  * declarations