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);