diff options
author | Ori Bernstein <ori@eigenstate.org> | 2013-05-26 16:44:12 -0400 |
---|---|---|
committer | Ori Bernstein <ori@eigenstate.org> | 2013-05-26 16:44:12 -0400 |
commit | d667281e1d2da0c39a21505bcc383af7a30b01b8 (patch) | |
tree | 6fc578140f43bd5f1be51db794345e1931c2c629 | |
parent | 6ef4f09df64f4215213545cc9d1da748c830362b (diff) | |
download | mc-d667281e1d2da0c39a21505bcc383af7a30b01b8.tar.gz |
Tag exported types.
-rw-r--r-- | parse/parse.h | 9 | ||||
-rw-r--r-- | parse/type.c | 5 | ||||
-rw-r--r-- | parse/use.c | 63 |
3 files changed, 70 insertions, 7 deletions
diff --git a/parse/parse.h b/parse/parse.h index 301d1f9..614ed63 100644 --- a/parse/parse.h +++ b/parse/parse.h @@ -51,6 +51,13 @@ typedef enum { } Tc; typedef enum { + Visintern, + Visexport, + Vishidden, + Visbuiltin, +} Vis; + +typedef enum { Dclconst = 1 << 0, Dclextern = 1 << 1, } Dclflags; @@ -97,6 +104,7 @@ struct Type { Ty type; int tid; int line; + Vis vis; int resolved; /* Have we resolved the subtypes? Prevents infinite recursion. */ int fixed; /* Have we fixed the subtypes? Prevents infinite recursion. */ @@ -255,6 +263,7 @@ extern Tok *curtok; /* the last token we tokenized */ extern int line; /* the last line number we tokenized */ extern Node *file; /* the current file we're compiling */ extern Type **tytab; /* type -> type map used by inference. size maintained by type creation code */ +extern Type **types; extern size_t ntypes; extern Cstr **cstrtab; /* int -> cstr map */ extern size_t ncstrs; diff --git a/parse/type.c b/parse/type.c index 392161c..10c704a 100644 --- a/parse/type.c +++ b/parse/type.c @@ -18,6 +18,7 @@ struct Typename { }; Type **tytab = NULL; +Type **types = NULL; size_t ntypes; Cstr **cstrtab; size_t ncstrs; @@ -36,6 +37,10 @@ Type *mktype(int line, Ty ty) t->line = line; tytab = xrealloc(tytab, ntypes*sizeof(Type*)); tytab[t->tid] = NULL; + types = xrealloc(types, ntypes*sizeof(Type*)); + types[t->tid] = t; + if (ty <= Tyvalist) /* the last builtin atomic type */ + t->vis = Visbuiltin; for(i = 0; tycstrs[ty][i]; i++) setcstr(t, tycstrs[ty][i]); diff --git a/parse/use.c b/parse/use.c index 857f9de..e7101d6 100644 --- a/parse/use.c +++ b/parse/use.c @@ -211,6 +211,11 @@ static void wrtype(FILE *fd, Type *ty) } } +static void typickle(Type *t, FILE *fd) +{ + wrtype(fd, t); +} + /* Writes types to a file. Errors on * internal only types like Tyvar that * will not be meaningful in another file */ @@ -627,11 +632,55 @@ void readuse(Node *use, Stab *st) die("Could not load usefile %s", use->use.name); } +void taghidden(Type *t) +{ + size_t i; + + if (t->vis != Visintern) + return; + t->vis = Vishidden; + for (i = 0; i < t->nsub; i++) { + taghidden(t->sub[i]); + } + if (t->type == Tystruct) { + for (i = 0; i < t->nmemb; i++) + taghidden(decltype(t->sdecls[i])); + } else if (t->type == Tyunion) { + for (i = 0; i < t->nmemb; i++) { + if (t->udecls[i]->etype) + taghidden(t->udecls[i]->etype); + } + } +} + +void tagexports(Stab *st) +{ + void **k; + Type *t; + size_t i, j, n; + + k = htkeys(st->ty, &n); + for (i = 0; i < n; i++) { + t = gettype(st, k[i]); + t->vis = Visexport; + for (j = 0; j < t->nsub; j++) + taghidden(t->sub[j]); + } + free(k); +} + + +/* Usefile format: + * U<pkgname> + * T<pickled-type> + * D<picled-decl> + * G<pickled-decl><pickled-initializer> + * Z + */ void writeuse(FILE *f, Node *file) { Stab *st; void **k; - Type *t; Node *s; size_t i, n; @@ -642,14 +691,14 @@ void writeuse(FILE *f, Node *file) else wrstr(f, NULL); - k = htkeys(st->ty, &n); - for (i = 0; i < n; i++) { - t = gettype(st, k[i]); - assert(t->type == Tyname || t->type == Tygeneric); + tagexports(st); + for (i = 0; i < ntypes; i++) { + if (types[i]->vis != Visexport) + continue; + assert(types[i]->type == Tyname || types[i]->type == Tygeneric); wrbyte(f, 'T'); - wrtype(f, t); + typickle(types[i], f); } - free(k); k = htkeys(st->dcl, &n); for (i = 0; i < n; i++) { s = getdcl(st, k[i]); |