summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOri Bernstein <ori@eigenstate.org>2013-05-26 16:44:12 -0400
committerOri Bernstein <ori@eigenstate.org>2013-05-26 16:44:12 -0400
commitd667281e1d2da0c39a21505bcc383af7a30b01b8 (patch)
tree6fc578140f43bd5f1be51db794345e1931c2c629
parent6ef4f09df64f4215213545cc9d1da748c830362b (diff)
downloadmc-d667281e1d2da0c39a21505bcc383af7a30b01b8.tar.gz
Tag exported types.
-rw-r--r--parse/parse.h9
-rw-r--r--parse/type.c5
-rw-r--r--parse/use.c63
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]);