Commit 5f0a5e7a authored by Ken Thompson's avatar Ken Thompson

more export

R=r
OCL=15771
CL=15771
parent 3f106f97
...@@ -28,15 +28,11 @@ exportsym(Sym *s) ...@@ -28,15 +28,11 @@ exportsym(Sym *s)
} }
void void
reexport(Type *t) makeexportsym(Type *t)
{ {
Sym *s; Sym *s;
if(t == T) if(t->sym == S) {
fatal("reexport: type nil");
s = t->sym;
if(s == S/* || s->name[0] == '_'*/) {
exportgen++; exportgen++;
snprint(namebuf, sizeof(namebuf), "_e%s_%.3ld", filename, exportgen); snprint(namebuf, sizeof(namebuf), "_e%s_%.3ld", filename, exportgen);
s = lookup(namebuf); s = lookup(namebuf);
...@@ -44,6 +40,18 @@ reexport(Type *t) ...@@ -44,6 +40,18 @@ reexport(Type *t)
s->otype = t; s->otype = t;
t->sym = s; t->sym = s;
} }
}
void
reexport(Type *t)
{
Sym *s;
if(t == T)
fatal("reexport: type nil");
makeexportsym(t);
s = t->sym;
dumpexporttype(s); dumpexporttype(s);
} }
...@@ -164,14 +172,17 @@ dumpexporttype(Sym *s) ...@@ -164,14 +172,17 @@ dumpexporttype(Sym *s)
case TPTR32: case TPTR32:
case TPTR64: case TPTR64:
if(t->type != T && t->type->sym == S) if(t->type == T)
reexport(t->type); fatal("dumpexporttype: ptr %S", s);
makeexportsym(t->type); /* forw declare */
/* type 6 */ /* type 6 */
Bprint(bout, "\ttype "); Bprint(bout, "\ttype ");
if(s->export != 0) if(s->export != 0)
Bprint(bout, "!"); Bprint(bout, "!");
Bprint(bout, "%lS *%lS\n", s, t->type->sym); Bprint(bout, "%lS *%lS\n", s, t->type->sym);
reexport(t->type);
break; break;
case TFUNC: case TFUNC:
...@@ -220,7 +231,7 @@ dumpexporttype(Sym *s) ...@@ -220,7 +231,7 @@ dumpexporttype(Sym *s)
reexport(t->type); reexport(t->type);
reexport(t->down); reexport(t->down);
/* type 6 */ /* type 1 */
Bprint(bout, "\ttype "); Bprint(bout, "\ttype ");
if(s->export != 0) if(s->export != 0)
Bprint(bout, "!"); Bprint(bout, "!");
...@@ -323,6 +334,50 @@ dumpexport(void) ...@@ -323,6 +334,50 @@ dumpexport(void)
/* /*
* ******* import ******* * ******* 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 void
renamepkg(Node *n) renamepkg(Node *n)
{ {
...@@ -451,21 +506,13 @@ importaddtyp(Node *ss, Type *t) ...@@ -451,21 +506,13 @@ importaddtyp(Node *ss, Type *t)
Sym *s; Sym *s;
s = getimportsym(ss); s = getimportsym(ss);
if(ss->etype){ // exported if(s->otype != T && !eqtype(t, s->otype, 0)) {
if(s->otype == T || !eqtype(t, s->otype, 0)) { yyerror("import redeclaration of %S %lT => %lT\n", s, s->otype, t);
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{
s->otype = t; s->otype = t;
t->sym = s;
} }
if(s->otype == T)
addtyp(newtype(s), t, PEXTERN);
} }
/* /*
......
...@@ -129,9 +129,13 @@ import_package: ...@@ -129,9 +129,13 @@ import_package:
import_there: import_there:
hidden_import_list_r ')' ')' hidden_import_list_r ')' ')'
{ {
checkimports();
unimportfile(); unimportfile();
} }
| LIMPORT '(' '(' hidden_import_list_r ')' ')' | LIMPORT '(' '(' hidden_import_list_r ')' ')'
{
checkimports();
}
/* /*
* declarations * declarations
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment