shithub: mc

Download patch

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)