shithub: mc

Download patch

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;
--