Commit 9f3d600b authored by Ken Thompson's avatar Ken Thompson

export

syntax for inheritance

R=r
OCL=16028
CL=16028
parent fb86c393
...@@ -6,16 +6,10 @@ ...@@ -6,16 +6,10 @@
#include "y.tab.h" #include "y.tab.h"
void void
exportsym(Sym *s) addexportsym(Sym *s)
{ {
Dcl *d, *r; Dcl *d, *r;
if(s == S)
return;
if(s->export != 0)
return;
s->export = 1;
d = mal(sizeof(*d)); d = mal(sizeof(*d));
d->dsym = s; d->dsym = s;
d->dnode = N; d->dnode = N;
...@@ -27,6 +21,18 @@ exportsym(Sym *s) ...@@ -27,6 +21,18 @@ exportsym(Sym *s)
r->back = d; r->back = d;
} }
void
exportsym(Sym *s)
{
if(s == S)
return;
if(s->export != 0)
return;
s->export = 1;
addexportsym(s);
}
void void
makeexportsym(Type *t) makeexportsym(Type *t)
{ {
...@@ -45,14 +51,10 @@ makeexportsym(Type *t) ...@@ -45,14 +51,10 @@ makeexportsym(Type *t)
void void
reexport(Type *t) reexport(Type *t)
{ {
Sym *s;
if(t == T) if(t == T)
fatal("reexport: type nil"); fatal("reexport: type nil");
makeexportsym(t); makeexportsym(t);
s = t->sym; dumpexporttype(t->sym);
dumpexporttype(s);
} }
void void
...@@ -130,7 +132,7 @@ dumpexporttype(Sym *s) ...@@ -130,7 +132,7 @@ dumpexporttype(Sym *s)
{ {
Type *t, *f; Type *t, *f;
Sym *ts; Sym *ts;
int et; int et, forw;
if(s->exported != 0) if(s->exported != 0)
return; return;
...@@ -174,15 +176,17 @@ dumpexporttype(Sym *s) ...@@ -174,15 +176,17 @@ dumpexporttype(Sym *s)
case TPTR64: case TPTR64:
if(t->type == T) if(t->type == T)
fatal("dumpexporttype: ptr %S", s); fatal("dumpexporttype: ptr %S", s);
makeexportsym(t->type); /* forw declare */ makeexportsym(t->type);
ts = t->type->sym;
if(ts->exported == 0)
addexportsym(ts);
/* 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, ts);
reexport(t->type);
break; break;
case TFUNC: case TFUNC:
...@@ -262,12 +266,15 @@ dumpe(Sym *s) ...@@ -262,12 +266,15 @@ dumpe(Sym *s)
break; break;
case LATYPE: case LATYPE:
case LBASETYPE: case LBASETYPE:
//print("TYPE %S\n", s);
dumpexporttype(s); dumpexporttype(s);
break; break;
case LNAME: case LNAME:
//print("VAR %S\n", s);
dumpexportvar(s); dumpexportvar(s);
break; break;
case LACONST: case LACONST:
//print("CONST %S\n", s);
dumpexportconst(s); dumpexportconst(s);
break; break;
} }
...@@ -326,6 +333,12 @@ dumpexport(void) ...@@ -326,6 +333,12 @@ dumpexport(void)
dumpm(d->dsym); dumpm(d->dsym);
} }
// third pass pick up redefs from previous passes
for(d=exportlist->forw; d!=D; d=d->forw) {
lineno = d->lineno;
dumpe(d->dsym);
}
Bprint(bout, " ))\n"); Bprint(bout, " ))\n");
lineno = lno; lineno = lno;
...@@ -343,6 +356,8 @@ checkimports(void) ...@@ -343,6 +356,8 @@ checkimports(void)
uint32 h; uint32 h;
int et; int et;
return;
for(h=0; h<NHASH; h++) for(h=0; h<NHASH; h++)
for(s = hash[h]; s != S; s = s->link) { for(s = hash[h]; s != S; s = s->link) {
t = s->otype; t = s->otype;
...@@ -511,8 +526,9 @@ importaddtyp(Node *ss, Type *t) ...@@ -511,8 +526,9 @@ importaddtyp(Node *ss, Type *t)
// the new type is the same as the old type // the new type is the same as the old type
if(eqtype(t, s->otype, 0)) if(eqtype(t, s->otype, 0))
return; return;
if(isptrto(t, TFORW)) if(isptrto(t, TFORW)) {
return; // hard part return; // hard part
}
warn("redeclare import %S from %lT to %lT", warn("redeclare import %S from %lT to %lT",
s, s->otype, t); s, s->otype, t);
return; return;
......
...@@ -1256,6 +1256,17 @@ structdcl: ...@@ -1256,6 +1256,17 @@ structdcl:
$$ = nod(ODCLFIELD, $1, N); $$ = nod(ODCLFIELD, $1, N);
$$->type = $2; $$->type = $2;
} }
| new_name
{
// must be a latype
$$ = nod(ODCLFIELD, N, N);
$$->type = $1;
}
| LIMPORT structdcl
{
$$ = $2;
$$->etype = OIMPORT;
}
interfacedcl: interfacedcl:
new_name ',' interfacedcl new_name ',' interfacedcl
......
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