shithub: mc

Download patch

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;