shithub: mc

Download patch

ref: 452ac3b08e239c88311f727f63907a0e11196596
parent: 2f0d212525179efc4513902c78226af083e5af1b
author: Ori Bernstein <[email protected]>
date: Sun May 13 08:26:56 EDT 2012

Don't crash on pickling and unpickling stabs.

    First, we were getting the wrong type of value out of the stab.
    Then we weren't allocating the sub decls.

--- a/parse/pickle.c
+++ b/parse/pickle.c
@@ -153,7 +153,7 @@
     keys = htkeys(val->dcl, &n);
     wrint(fd, n);
     for (i = 0; i < n; i++)
-        wrsym(fd, htget(val->dcl, keys[i]));
+        wrsym(fd, getdcl(val, keys[i]));
     free(keys);
 
     /* write types */
@@ -161,7 +161,7 @@
     wrint(fd, n);
     for (i = 0; i < n; i++) {
         pickle(keys[i], fd); /* name */
-        wrtype(fd, htget(val->ty, keys[i])); /* type */
+        wrtype(fd, gettype(val, keys[i])); /* type */
     }
     free(keys);
 
@@ -169,7 +169,7 @@
     keys = htkeys(val->ns, &n);
     wrint(fd, n);
     for (i = 0; i < n; i++)
-        wrstab(fd, htget(val->ns, keys[i]));
+        wrstab(fd, getns(val, keys[i]));
     free(keys);
 }
 
@@ -282,8 +282,6 @@
     /* tid is generated; don't write */
     /* cstrs are left out for now: FIXME */
     ty->nsub = rdint(fd);
-    if (ty->nsub > 0)
-        ty->sub = xalloc(ty->nsub * sizeof(Type*));
     switch (ty->type) {
         case Tyname:
             ty->name = unpickle(fd);
@@ -292,14 +290,17 @@
             ty->pname = rdstr(fd);
             break;
         case Tystruct: 
+            ty->sdecls = xalloc(ty->nsub * sizeof(Node*));
             for (i = 0; i < ty->nsub; i++)
                 ty->sdecls[i] = unpickle(fd);
             break;
         case Tyunion: 
+            ty->udecls = xalloc(ty->nsub * sizeof(Node*));
             for (i = 0; i < ty->nsub; i++)
                 ty->udecls[i] = unpickle(fd);
             break;
         case Tyenum: 
+            ty->edecls = xalloc(ty->nsub * sizeof(Node*));
             for (i = 0; i < ty->nsub; i++)
                 ty->edecls[i] = unpickle(fd);
             break;
@@ -308,6 +309,8 @@
             ty->asize = unpickle(fd);
             break;
         default:
+            if (ty->nsub > 0)
+                ty->sub = xalloc(ty->nsub * sizeof(Type*));
             for (i = 0; i < ty->nsub; i++)
                 ty->sub[i] = rdtype(fd);
             break;
--- a/parse/stab.c
+++ b/parse/stab.c
@@ -110,7 +110,7 @@
     return NULL;
 }
 
-Stab *getstab(Stab *st, Node *n)
+Stab *getns(Stab *st, Node *n)
 {
     Stab *s;
     do {
@@ -150,7 +150,7 @@
 {
     Stab *s;
 
-    s = getstab(st, scope->name);
+    s = getns(st, scope->name);
     if (s)
         fatal(scope->name->line, "Ns %s already defined", name(s->name));
     htput(st->ns, scope->name, scope);