ref: 8dbc15066f3576d63ee6f29824b4abeeaaa51e20
parent: fb324f09c66a57b4566c134232d835ac5ef42796
author: Ori Bernstein <orib@google.com>
date: Thu Dec 15 14:50:52 EST 2011
Actually descend down the AST when inferring.
--- a/parse/dump.c
+++ b/parse/dump.c
@@ -146,6 +146,10 @@
indent(fd, depth);
fprintf(fd, ")\n");
outnode(n->func.body, fd, depth+1);
+ break;
+ case Nlbl:
+ fprintf(fd, "(lbl = %s)\n", n->lbl.name);
+ break;
case Nname:
fprintf(fd, "(");
for (i = 0; i < n->name.nparts; i++) {
--- a/parse/infer.c
+++ b/parse/infer.c
@@ -17,7 +17,8 @@
int i;
/* uses only allowed at top level. Do we want to keep it this way? */
for (i = 0; i < n->file.nuses; i++)
- readuse(n->file.uses[i], n->file.globls);
+ fprintf(stderr, "INTERNAL: implement use loading\n");
+ /* readuse(n->file.uses[i], n->file.globls); */
}
/* a => b */
@@ -25,14 +26,6 @@
{
}
-static void inferdecl(Node *n)
-{
- Type *t;
-
- t = decltype(n);
- settype(n, t);
-}
-
static Op exprop(Node *e)
{
assert(e->type == Nexpr);
@@ -178,9 +171,13 @@
{
}
-static void loaduse(Node *n)
+static void inferdecl(Node *n)
{
- fprintf(stderr, "INTERNAL: implement usefiles");
+ Type *t;
+
+ t = decltype(n);
+ settype(n, t);
+ inferexpr(n->decl.init, NULL);
}
static void infernode(Node *n)
@@ -189,8 +186,6 @@
switch (n->type) {
case Nfile:
- for (i = 0; i < n->file.nuses; i++)
- loaduse(n->file.uses[i]);
for (i = 0; i < n->file.nstmts; i++)
infernode(n->file.stmts[i]);
break;
@@ -219,6 +214,7 @@
case Nname:
case Nlit:
case Nuse:
+ case Nlbl:
break;
}
}
@@ -238,6 +234,7 @@
void infer(Node *file)
{
assert(file->type == Nfile);
+
loaduses(file);
infernode(file);
infercompn(file);
--- a/parse/main.c
+++ b/parse/main.c
@@ -50,6 +50,8 @@
file->file.globls = mkstab(NULL);
yyparse();
dump(file, stdout);
+ infer(file);
+ dump(file, stdout);
gen();
}
--- a/parse/parse.h
+++ b/parse/parse.h
@@ -99,7 +99,7 @@
struct Node {
int line;
- int type;
+ Ntype type;
union {
struct {
char *name;
--
⑨