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