shithub: mc

Download patch

ref: 49a8bf1bb3dde551d210abe1a659af99cc46a783
parent: 73ecd7d7b9192afb96091fdd1717f91b8003a193
author: Ori Bernstein <[email protected]>
date: Sun Nov 20 17:29:56 EST 2011

Don't die on function types.

--- a/parse/gram.y
+++ b/parse/gram.y
@@ -149,7 +149,8 @@
 
 toplev
         : decl          
-            {nlappend(&file->file.stmts, &file->file.nstmts, $1);}
+            {nlappend(&file->file.stmts, &file->file.nstmts, $1);
+             def($1);}
         | use           
             {nlappend(&file->file.uses, &file->file.nuses, $1);}
         | package
@@ -188,7 +189,7 @@
         ;
 
 pkgitem : decl
-        | type
+        | typedef
         | visdef
         | TEndln
         ;
@@ -499,7 +500,7 @@
 blockbody
         : stmt 
             {
-                $$ = mkblock($1->line, NULL); 
+                $$ = mkblock(line, NULL); 
                 nlappend(&$$->block.stmts, &$$->block.nstmts, $1);
             }
         | blockbody stmt 
--- a/parse/node.c
+++ b/parse/node.c
@@ -193,6 +193,16 @@
     return n;
 }
 
+Type *decltype(Node *n)
+{
+    return n->decl.sym->type;
+}
+
+void def(Node *n)
+{
+    assert(n->type == Ndecl);
+}
+
 void setns(Node *n, char *name)
 {
     int i;
--- a/parse/parse.h
+++ b/parse/parse.h
@@ -180,6 +180,7 @@
 extern int line;
 extern Tok *curtok;
 extern Node *file;
+extern Stab *scope;
 
 /* util functions */
 void *zalloc(size_t size);
@@ -188,6 +189,7 @@
 void  die(char *msg, ...);
 void  fatal(int line, char *fmt, ...);
 char *strdupn(char *s, size_t len);
+void *memdup(void *mem, size_t len);
 
 /* parsing etc */
 void tokinit(char *file);
@@ -244,8 +246,10 @@
 Node *mkdecl(int line, Sym *sym);
 Node *mklabel(int line, char *lbl);
 
+Type *decltype(Node *n);
 void addstmt(Node *file, Node *stmt);
 void setns(Node *n, char *name);
+void def(Node *n);
 
 /* usefiles */
 void readuse(Node *use, Stab *into);
--- a/parse/type.c
+++ b/parse/type.c
@@ -116,13 +116,14 @@
 Type *mktyfunc(int line, Node **args, size_t nargs, Type *ret)
 {
     Type *t;
-    Type **sub;
+    int i;
 
     t = mktype(Tyfunc);
-    sub = xalloc((1 + nargs)*sizeof(Type));
-    sub[0] = ret;
-    die("pull out subtypes for fn");
-    t->fnsub = sub;
+    t->nsub = nargs + 1;
+    t->fnsub = xalloc((1 + nargs)*sizeof(Type));
+    t->fnsub[0] = ret;
+    for (i = 0; i < nargs; i++)
+        t->fnsub[i + 1] = decltype(args[i]);
     return t;
 }
 
@@ -131,7 +132,8 @@
     Type *t;
 
     t = mktype(Tystruct);
-    t->sdecls = decls;
+    t->nsub = ndecls;
+    t->sdecls = memdup(decls, ndecls*sizeof(Node *));
     return t;
 }
 
--- a/parse/util.c
+++ b/parse/util.c
@@ -74,3 +74,11 @@
     memcpy(ret, s, len);
     return ret;
 }
+
+void *memdup(void *mem, size_t len)
+{
+    void *ret;
+
+    ret = xalloc(len);
+    return memcpy(ret, mem, len);
+}