ref: 507aaa9c4ded77834703eec0961757f8e535de2e
parent: 0642dae7fd76080cae32ea7055f645579d5f9bc2
author: Ori Bernstein <ori@eigenstate.org>
date: Tue Jan 3 18:27:53 EST 2012
Simplify type reading/writing.
--- a/parse/parse.h
+++ b/parse/parse.h
@@ -94,8 +94,8 @@
struct Type {Ty type;
int tid;
- size_t nsub; /* For fnsub, tusub, sdecls, udecls, edecls. */
Bitset *cstrs; /* the type constraints matched on this type */
+ size_t nsub; /* For fnsub, tusub, sdecls, udecls, edecls. */
Type **sub; /* sub-types; shared by all composite types */
union {Node *name; /* Tyname: unresolved name */
@@ -280,8 +280,6 @@
int constrain(Type *t, Cstr *c);
char *tyfmt(char *buf, size_t len, Type *t);
char *tystr(Type *t);
-char *tyenc(Type *t);
-Type *tydec(char *s);
void tlappend(Type ***tl, int *len, Type *t);
--- a/parse/pickle.c
+++ b/parse/pickle.c
@@ -193,24 +193,84 @@
}
-static void wrtype(FILE *fd, Type *t)
+static void wrtype(FILE *fd, Type *ty)
{- char *enc;
+ int i;
- enc = tyenc(t);
- wrstr(fd, enc);
- free(enc);
+ wrbyte(fd, ty->type);
+ /* tid is generated; don't write */
+ /* cstrs are left out for now: FIXME */
+ wrint(fd, ty->nsub);
+ switch (ty->type) {+ case Tyname:
+ pickle(ty->name, fd);
+ break;
+ case Typaram:
+ wrstr(fd, ty->pname);
+ break;
+ case Tystruct:
+ for (i = 0; i < ty->nsub; i++)
+ pickle(ty->sdecls[i], fd);
+ break;
+ case Tyunion:
+ for (i = 0; i < ty->nsub; i++)
+ pickle(ty->udecls[i], fd);
+ break;
+ case Tyenum:
+ for (i = 0; i < ty->nsub; i++)
+ pickle(ty->edecls[i], fd);
+ break;
+ case Tyarray:
+ wrtype(fd, ty->sub[0]);
+ pickle(ty->asize, fd);
+ break;
+ default:
+ for (i = 0; i < ty->nsub; i++)
+ wrtype(fd, ty->sub[i]);
+ break;
+ }
}
/*static*/ Type *rdtype(FILE *fd)
{- Type *t;
- char *s;
+ Type *ty;
+ Ty t;
+ int i;
- s = rdstr(fd);
- t = tydec(s);
- free(s);
- return t;
+ t = rdbyte(fd);
+ ty = mkty(-1, t);
+ /* tid is generated; don't write */
+ /* cstrs are left out for now: FIXME */
+ ty->nsub = rdint(fd);
+ switch (ty->type) {+ case Tyname:
+ ty->name = unpickle(fd);
+ break;
+ case Typaram:
+ ty->pname = rdstr(fd);
+ break;
+ case Tystruct:
+ for (i = 0; i < ty->nsub; i++)
+ ty->sdecls[i] = unpickle(fd);
+ break;
+ case Tyunion:
+ for (i = 0; i < ty->nsub; i++)
+ ty->udecls[i] = unpickle(fd);
+ break;
+ case Tyenum:
+ for (i = 0; i < ty->nsub; i++)
+ ty->edecls[i] = unpickle(fd);
+ break;
+ case Tyarray:
+ ty->sub[0] = rdtype(fd);
+ ty->asize = unpickle(fd);
+ break;
+ default:
+ for (i = 0; i < ty->nsub; i++)
+ ty->sub[i] = rdtype(fd);
+ break;
+ }
+ return ty;
}
/* pickle format:
--- a/parse/type.c
+++ b/parse/type.c
@@ -367,156 +367,6 @@
return strdup(buf);
}
-static struct {- char enc; /* character to encode */
- int special; /* 0 => atomic, 1 => unary, 2 => nary, -1 => special-cased */
-} enctab[] = {- [Tybad] = {'\0',0},- [Tyvoid] = {'z', 0},-
- [Tybool] = {'t', 0},- [Tychar] = {'c', 0},-
- [Tyint8] = {'h', 0},- [Tyint16] = {'s', 0},- [Tyint] = {'i', 0},- [Tyint32] = {'l', 0},- [Tyint64] = {'q', 0},- [Tylong] = {'v', 0},-
- [Tybyte] = {'b', 0},- [Tyuint8] = {'H', 0},- [Tyuint16] = {'S', 0},- [Tyuint] = {'I', 0},- [Tyuint32] = {'L', 0},- [Tyuint64] = {'Q', 0},- [Tyulong] = {'V', 0},-
- [Tyfloat32] = {'f', 0},- [Tyfloat64] = {'F', 0},-
- [Tyvalist] = {'.', 1},- [Typtr] = {'*', 1},- [Tyslice] = {':', 1},- [Tyarray] = {'$', 1},- [Tyfunc] = {'<', 2},- [Tytuple] = {',', 2},- [Tyvar] = {'#', -1},- [Typaram] = {'@', -1},- [Tyname] = {'%', -1},- [Tystruct] = {'^', -1},- [Tyunion] = {'!', -1},- [Tyenum] = {'/', -1},- [Ntypes] = {'\0', 0}-};
-
-static int encbuf(Type *t, char *buf, size_t len)
-{- char *p;
- char *end;
- int i;
-
- p = buf;
- end = buf + len;
-
- if (len <= 0)
- return 0;
- *p++ = enctab[t->type].enc;
- if (enctab[t->type].special == 1) {- encbuf(t->sub[0], p, end - p);
- } else if (enctab[t->type].special == 2) {- p += snprintf(p, end - p, "%zd", t->nsub);
- for (i = 0; i < t->nsub; i++)
- encbuf(t->sub[i], p, end - p);
- } else if (enctab[t->type].special == -1) {- switch (t->type) {- case Tyname: p += namefmt(p, end - p, t->name); break;
- case Tyvar: die("Tyvar is not encodable"); break;- case Typaram: p += snprintf(p, end - p, "%s;", t->pname); break;
- case Tystruct:
- case Tyunion:
- case Tyenum:
- default:
- die("type %s should not be special", tystr(t));- }
- /* all special forms end with ';' */
- snprintf(p, end - p, ";");
- } else {- die("Don't know how to encode %s", tystr(t));- }
- return p - buf;
-}
-
-char *tyenc(Type *t)
-{- char buf[1024];
-
- encbuf(t, buf, 1024);
- return strdup(buf);
-}
-
-static Type *decname(char *p)
-{- char *name;
- char *parts[16];
- char *startp;
- int i;
- Node *n;
-
- i = 0;
- name = p;
- startp = p;
- while (1) {- if (*p == '.' || *p == ';') {- if (i == 16)
- die("too many parts to name %s", name);- parts[i++] = strdupn(startp, p - startp);
- startp = p;
- }
- if (!*p)
- die("bad decoded name %s", name);- if (*p == ';')
- break;
- if (*p == '.')
- p++;
- p++;
- }
-
- n = mkname(-1, parts[i - 1]);
- i--;
- for (; i > 0; i--)
- setns(n, parts[i - 1]);
- return mktynamed(-1, n);
-}
-
-Type *tydec(char *p)
-{- Ty i;
- Type *t;
-
- for (i = 0; i < Ntypes; i++) {- if (enctab[i].enc == *p)
- break;
- }
- p++;
- if (enctab[i].special == 0) {- t = mkty(-1, i);
- } else if (enctab[i].special == 1) {- t = mkty(-1, i);
- t->nsub = 1;
- t->sub = xalloc(sizeof(Type*));
- t->sub[0] = tydec(p);
- } else {- switch (i) {- case Tyname: t = decname(p); break;
- default:
- die("Unimplemented tydec for %s", p);- break;
- }
- }
- return t;
-}
-
void tyinit(void)
{int i;
--
⑨