shithub: mc

Download patch

ref: a63c8ce234719b9ae18f1d7423c817abf71a040b
parent: a58bb4d8050a315319b555ba4f51cad5ec4c4947
author: Ori Bernstein <[email protected]>
date: Wed Dec 14 13:10:35 EST 2011

Start stubbing in inference.

--- a/parse/infer.c
+++ b/parse/infer.c
@@ -8,6 +8,7 @@
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <unistd.h>
+#include <assert.h>
 
 #include "parse.h"
 
@@ -19,12 +20,81 @@
         readuse(n->file.uses[i], n->file.globls);
 }
 
+/* a => b */
+static void settype(Node *n, Type *t)
+{
+}
+
 static void inferdecl(Node *n)
 {
+    Type *t;
+
+    t = decltype(n);
+    settype(n, t);
 }
 
+static Op exprop(Node *e)
+{
+    assert(e->type == Nexpr);
+    return e->expr.op;
+}
+
 static void inferexpr(Node *n)
 {
+    switch (exprop(n)) {
+        /* all operands are same type */
+        case Oadd:      /* @a + @a -> @a */
+        case Osub:      /* @a - @a -> @a */
+        case Omul:      /* @a * @a -> @a */
+        case Odiv:      /* @a / @a -> @a */
+        case Omod:      /* @a % @a -> @a */
+        case Oneg:      /* -@a -> @a */
+        case Obor:      /* @a | @a -> @a */
+        case Oband:     /* @a & @a -> @a */
+        case Obxor:     /* @a ^ @a -> @a */
+        case Obsl:      /* @a << @a -> @a */
+        case Obsr:      /* @a >> @a -> @a */
+        case Obnot:     /* ~@a -> @a */
+        case Opreinc:   /* ++@a -> @a */
+        case Opredec:   /* --@a -> @a */
+        case Opostinc:  /* @a++ -> @a */
+        case Opostdec:  /* @a-- -> @a */
+        case Oaddr:     /* &@a -> @a* */
+        case Oderef:    /* *@a* ->  @a */
+        case Olor:      /* @a || @b -> bool */
+        case Oland:     /* @a && @b -> bool */
+        case Olnot:     /* !@a -> bool */
+        case Oeq:       /* @a == @a -> bool */
+        case One:       /* @a != @a -> bool */
+        case Ogt:       /* @a > @a -> bool */
+        case Oge:       /* @a >= @a -> bool */
+        case Olt:       /* @a < @a -> bool */
+        case Ole:       /* @a <= @b -> bool */
+        case Oasn:      /* @a = @a -> @a */
+        case Oaddeq:    /* @a += @a -> @a */
+        case Osubeq:    /* @a -= @a -> @a */
+        case Omuleq:    /* @a *= @a -> @a */
+        case Odiveq:    /* @a /= @a -> @a */
+        case Omodeq:    /* @a %= @a -> @a */
+        case Oboreq:    /* @a |= @a -> @a */
+        case Obandeq:   /* @a &= @a -> @a */
+        case Obxoreq:   /* @a ^= @a -> @a */
+        case Obsleq:    /* @a <<= @a -> @a */
+        case Obsreq:    /* @a >>= @a -> @a */
+        case Oidx:      /* @a[@b::tcint] -> @a */
+        case Oslice:    /* @a[@b::tcint,@b::tcint] -> @a[,] */
+        case Omemb:     /* @a.Ident -> @b, verify type(@a.Ident)==@b later */
+        case Osize:     /* sizeof @a -> size */
+        case Ocall:     /* (@a, @b, @c, ... -> @r)(@a,@b,@c, ... -> @r) -> @r */
+        case Ocast:     /* cast(@a, @b) -> @b */
+        case Oret:      /* -> @a -> void */
+        case Ogoto:     /* goto void* -> void */
+        case Ovar:      /* a:@a -> @a */
+        case Olit:      /* <lit>:@a::tyclass -> @a */
+        case Olbl:      /* :lbl -> void* */
+        case Obad:      /* error! */
+            break;
+    }
 }
 
 static void inferlit(Node *n)
@@ -37,6 +107,7 @@
 
 static void loaduse(Node *n)
 {
+    fprintf(stderr, "INTERNAL: implement usefiles");
 }
 
 static void infernode(Node *n)
--- a/parse/node.c
+++ b/parse/node.c
@@ -195,6 +195,7 @@
 
 Type *decltype(Node *n)
 {
+    assert(n->type == Ndecl);
     return n->decl.sym->type;
 }
 
--- a/parse/ops.def
+++ b/parse/ops.def
@@ -17,7 +17,6 @@
 O(Opostdec)
 O(Oaddr)
 O(Oderef)
-O(Onegl)
 O(Olor)
 O(Oland)
 O(Olnot)
--- a/parse/parse.h
+++ b/parse/parse.h
@@ -211,7 +211,6 @@
 
 /* type creation */
 void tyinit(); /* sets up built in types */
-Type *optype(Op o);
 
 Type *mktyvar(int line);
 Type *mktyparam(int line, char *name);
@@ -223,9 +222,9 @@
 Type *mktystruct(int line, Node **decls, size_t ndecls);
 Type *mktyunion(int line, Node **decls, size_t ndecls);
 Type *mktyenum(int line, Node **decls, size_t ndecls);
-
 Cstr *mkcstr(int line, char *name, Node **reqmemb, size_t nreqmemb, Node **reqdecl, size_t nreqdecl); 
 
+/* type manipulation */
 int hascstr(Type *t, Cstr *c);
 char *tyfmt(char *buf, size_t len, Type *t);
 char *tystr(Type *t);
@@ -232,7 +231,7 @@
 
 void tlappend(Type ***tl, int *len, Type *t);
 
-/* tree creation */
+/* node creation */
 Node *mkfile(char *name);
 Node *mkuse(int line, char *use, int islocal);
 Node *mkexpr(int line, Op op, ...); /* NULL terminated */
@@ -253,6 +252,7 @@
 Node *mkdecl(int line, Sym *sym);
 Node *mklabel(int line, char *lbl);
 
+/* node util functions */
 Type *decltype(Node *n);
 void addstmt(Node *file, Node *stmt);
 void setns(Node *n, char *name);