ref: 72544d0e40f3aa0dabec5a7833b1dad17b435c74
parent: 87cb410f45da23b97e79f3949b4d6ebf779cf986
author: Ori Bernstein <[email protected]>
date: Sat Jun 16 21:28:23 EDT 2012
Make loading usefiles work completely.
--- a/parse/dump.c
+++ b/parse/dump.c
@@ -55,7 +55,7 @@
char *ty;
indent(fd, depth);
- fprintf(fd, "Stab %p (super = %p)\n", st, st ? st->super : NULL);
+ fprintf(fd, "Stab %p (super = %p, name=\"%s\")\n", st, st->super, namestr(st->name));
if (!st)
return;
@@ -79,8 +79,14 @@
/* already indented */
outsym(getdcl(st, k[i]), fd, 0);
}
-
- /* FIXME: dump namespaces */
+ free(k);
+
+ k = htkeys(st->ns, &n);
+ for (i = 0; i < n; i++) {
+ indent(fd, depth + 1);
+ fprintf(fd, "N %s\n", namestr(k[i]));
+ outstab(getns(st, k[i]), fd, depth + 1);
+ }
free(k);
}
--- a/parse/node.c
+++ b/parse/node.c
@@ -280,6 +280,8 @@
char *namestr(Node *name)
{
+ if (!name)
+ return "";
assert(name->type == Nname);
return name->name.parts[0];
}
--- a/parse/use.c
+++ b/parse/use.c
@@ -14,6 +14,10 @@
int loaduse(FILE *f, Stab *st)
{
char *pkg;
+ Stab *s;
+ Sym *dcl;
+ Type *t;
+ Node *n;
int c;
if (fgetc(f) != 'U')
@@ -22,14 +26,37 @@
/* if the package names match up, or the usefile has no declared
* package, then we simply add to the current stab. Otherwise,
* we add a new stab under the current one */
- if (pkg) {
- printf("package name %s\n", pkg);
+ if (st->name) {
+ if (pkg && !strcmp(pkg, namestr(st->name))) {
+ s = st;
+ } else {
+ s = mkstab();
+ s->name = mkname(-1, pkg);
+ putns(st, s);
+ }
+ } else {
+ if (pkg) {
+ s = mkstab();
+ s->name = mkname(-1, pkg);
+ putns(st, s);
+ } else {
+ s = st;
+ }
}
while ((c = fgetc(f)) != 'Z') {
switch(c) {
- case 'G': die("We didn't implement generics yet!"); break;
- case 'D': dumpsym(symunpickle(f), stdout); break;
- case 'T': fprintf(stdout, "%s\n", tystr(tyunpickle(f))); break;
+ case 'G':
+ die("We didn't implement generics yet!");
+ break;
+ case 'D':
+ dcl = symunpickle(f);
+ putdcl(s, dcl);
+ break;
+ case 'T':
+ n = mkname(-1, rdstr(f));
+ t = tyunpickle(f);
+ puttype(s, n, t);
+ break;
case EOF:
break;
}
@@ -89,6 +116,7 @@
for (i = 0; i < n; i++) {
t = htget(st->ty, k[i]);
wrbyte(f, 'T');
+ wrstr(f, namestr(k[i]));
typickle(t, f);
}
free(k);
--- a/util/muse.c
+++ b/util/muse.c
@@ -32,6 +32,7 @@
{
int opt;
int i;
+ Stab *s;
Stab *globls;
Node *rdback;
FILE *tmp;
@@ -85,8 +86,9 @@
f = fopen(outfile, "w");
writeuse(file, f);
fclose(f);
- readuse(mkuse(-1, outfile, 1), file->file.globls);
-
+ s = mkstab();
+ readuse(mkuse(-1, outfile, 1), s);
+ dumpstab(s, stdout);
}
return 0;