ref: 7a0b41daf3e2dcf9ec979a4920f2dc13e698f81e
parent: fe2828953f8d6ee39675e921d28d48a9e9cb442e
author: Ori Bernstein <[email protected]>
date: Mon Jan 9 18:04:32 EST 2012
Return proper written offset from fmtcstr.
--- a/parse/infer.c
+++ b/parse/infer.c
@@ -77,6 +77,8 @@
switch (n->type) {
case Nexpr: n->expr.type = t; break;
case Ndecl: n->decl.sym->type = t; break;
+ case Nlit: n->lit.type = t; break;
+ case Nfunc: n->func.type = t; break;
default:
die("can't set type of %s", nodestr(n->type));
break;
@@ -445,11 +447,20 @@
typesub(n->expr.args[i]);
break;
case Nfunc:
- die("don't do funcs yet...");
- typesub(n);
+ settype(n, tyfin(n->func.type));
+ for (i = 0; i < n->func.nargs; i++)
+ typesub(n->func.args[i]);
+ typesub(n->func.body);
break;
- case Nname:
case Nlit:
+ settype(n, tyfin(type(n)));
+ switch (n->lit.littype) {
+ case Lfunc: typesub(n->lit.fnval); break;
+ case Larray: typesub(n->lit.arrval); break;
+ default: break;
+ }
+ break;
+ case Nname:
case Nuse:
case Nlbl:
break;
--- a/parse/type.c
+++ b/parse/type.c
@@ -51,6 +51,7 @@
t->type = ty;
t->tid = ntypes++;
tytab = xrealloc(tytab, ntypes*sizeof(Type*));
+ tytab[t->tid] = NULL;
for(i = 0; tycstrs[ty][i]; i++)
constrain(t, tycstrs[ty][i]);
@@ -253,7 +254,7 @@
sep = ",";
}
}
- return end - p;
+ return p - buf;
}
static int tybfmt(char *buf, size_t len, Type *t)
@@ -348,7 +349,7 @@
if (t->type == Tyvar || t->type == Typaram)
p += cstrfmt(p, end - p, t);
- return len - (end - p);
+ return p - buf;
}
char *tyfmt(char *buf, size_t len, Type *t)