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