Skip to content

Commit

Permalink
get_vars for r0 to be used for lambda with closure
Browse files Browse the repository at this point in the history
  • Loading branch information
chutasano committed Apr 23, 2018
1 parent edfec5d commit 85b7fd6
Show file tree
Hide file tree
Showing 3 changed files with 114 additions and 1 deletion.
2 changes: 1 addition & 1 deletion bugs.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@ lib.c AFAIK. Hopefully no weirdness)

Rootstack is not properly accounted for across function calls. Need to fix

Global function names need to be uniquified(?)
Properly use movq vs leaq for refs vs values.

97 changes: 97 additions & 0 deletions rep/r0.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -388,6 +388,16 @@ int Read::t_check(unordered_map<string, int> &vmap)
return TNUM;
}

std::list<string> Binop::get_vars()
{
std::list<string> vs;
std::list<string> lvs = l->get_vars();
std::list<string> rvs = r->get_vars();
vs.insert(end(vs), begin(lvs), end(lvs));
vs.insert(end(vs), begin(rvs), end(rvs));
return vs;
}

Binop* Binop::clone() const
{
return new Binop(this->op, this->l->clone(), this->r->clone());
Expand Down Expand Up @@ -464,6 +474,14 @@ int Binop::t_check(unordered_map<string, int> &vmap)
return t;
}

std::list<string> Unop::get_vars()
{
std::list<string> vs;
std::list<string> vvs = v->get_vars();
vs.insert(end(vs), begin(vvs), end(vvs));
return vs;
}

Unop* Unop::clone() const
{
return new Unop(this->op, this->v->clone());
Expand Down Expand Up @@ -602,6 +620,19 @@ int GlobalVar::t_check(unordered_map<string, int> &vmap)
return t;
}

std::list<string> Call::get_vars()
{
std::list<string> vs;
std::list<string> fvs = func->get_vars();
vs.insert(end(vs), begin(fvs), end(fvs));
for (E* e : args)
{
std::list<string> argvs = e->get_vars();
vs.insert(end(vs), begin(argvs), end(argvs));
}
return vs;
}

Call* Call::clone() const
{
list<E*> ecopy;
Expand Down Expand Up @@ -686,6 +717,17 @@ E* Call::desugar()
}
return this;
}

std::list<string> Let::get_vars()
{
std::list<string> vs;
std::list<string> vvs = ve->get_vars();
std::list<string> bvs = be->get_vars();
vs.insert(end(vs), begin(vvs), end(vvs));
vs.insert(end(vs), begin(bvs), end(bvs));
return vs;
}

Let* Let::clone() const
{
return new Let(this->name, this->ve->clone(), this->be->clone());
Expand Down Expand Up @@ -722,6 +764,18 @@ int Let::t_check(unordered_map<string, int> &vmap)
return t;
}

std::list<string> If::get_vars()
{
std::list<string> vs;
std::list<string> cvs = conde->get_vars();
std::list<string> tvs = thene->get_vars();
std::list<string> evs = elsee->get_vars();
vs.insert(end(vs), begin(cvs), end(cvs));
vs.insert(end(vs), begin(tvs), end(tvs));
vs.insert(end(vs), begin(evs), end(evs));
return vs;
}

If* If::clone() const
{
return new If(conde->clone(), thene->clone(), elsee->clone());
Expand Down Expand Up @@ -784,6 +838,17 @@ int If::t_check(unordered_map<string, int> &vmap)
return t;
}

std::list<string> Vector::get_vars()
{
std::list<string> vs;
for (E* e : elist)
{
std::list<string> argvs = e->get_vars();
vs.insert(end(vs), begin(argvs), end(argvs));
}
return vs;
}

Vector* Vector::clone() const
{
list<E*> ecopy;
Expand Down Expand Up @@ -869,6 +934,14 @@ E* Vector::desugar()
return this;
}

std::list<string> VectorRef::get_vars()
{
std::list<string> vs;
std::list<string> vvs = vec->get_vars();
vs.insert(end(vs), begin(vvs), end(vvs));
return vs;
}

int VectorRef::t_check(unordered_map<string, int> &vmap)
{
if (t == TUNKNOWN)
Expand All @@ -889,6 +962,16 @@ c0::Arg* VectorRef::to_c0(unordered_map<string, int> &vars, vector<c0::AS*> &stm
return new c0::Var(s);
}

std::list<string> VectorSet::get_vars()
{
std::list<string> vs;
std::list<string> vvs = vec->get_vars();
std::list<string> avs = asg->get_vars();
vs.insert(end(vs), begin(vvs), end(vvs));
vs.insert(end(vs), begin(avs), end(avs));
return vs;
}

int VectorSet::t_check(unordered_map<string, int> &vmap)
{
if (t == TUNKNOWN)
Expand Down Expand Up @@ -917,6 +1000,14 @@ c0::Arg* VectorSet::to_c0(unordered_map<string, int> &vars, vector<c0::AS*> &stm
return new c0::Var(s);
}

std::list<string> Lambda::get_vars()
{
std::list<string> vs;
std::list<string> bvs = body->get_vars();
vs.insert(end(vs), begin(bvs), end(bvs));
return vs;
}

void Lambda::uniquify(unordered_map<string, string> m)
{
// manually uniquify function args
Expand Down Expand Up @@ -973,6 +1064,12 @@ list<E*> Sugar::get_childs()
exit(10);
}

list<string> Sugar::get_vars()
{
cerr << "Call desugar before using any r0->c0 functionality\n";
exit(10);
}

void Sugar::uniquify(unordered_map<string, string> a)
{
cerr << "Call desugar before using any r0->c0 functionality\n";
Expand Down
16 changes: 16 additions & 0 deletions rep/r0.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ namespace r0
E() : t(TUNKNOWN) { }
virtual ~E() { }
virtual std::list<E*> get_childs() = 0;
virtual std::list<std::string> get_vars() = 0;
virtual void uniquify(std::unordered_map<std::string, std::string>) = 0;
virtual int t_check(std::unordered_map<std::string, int>&) = 0;
virtual c0::Arg* to_c0(std::unordered_map<std::string, int> &vars,
Expand All @@ -33,6 +34,7 @@ namespace r0
Num(int64_t v) { value = v; }
int64_t value;
std::list<E*> get_childs() { return {}; }
std::list<std::string> get_vars() { return {}; }
void uniquify(std::unordered_map<std::string, std::string>);
int t_check(std::unordered_map<std::string , int>&);
c0::Arg* to_c0(std::unordered_map<std::string, int> &vars,
Expand All @@ -48,6 +50,7 @@ namespace r0
Bool(tbool v) { value = v; }
tbool value;
std::list<E*> get_childs() { return {}; }
std::list<std::string> get_vars() { return {}; }
void uniquify(std::unordered_map<std::string, std::string>);
int t_check(std::unordered_map<std::string , int>&);
c0::Arg* to_c0(std::unordered_map<std::string, int> &vars,
Expand All @@ -62,6 +65,7 @@ namespace r0
{
Read() { }
std::list<E*> get_childs() { return {}; }
std::list<std::string> get_vars() { return {}; }
void uniquify(std::unordered_map<std::string, std::string>);
int t_check(std::unordered_map<std::string , int>&);
c0::Arg* to_c0(std::unordered_map<std::string, int> &vars,
Expand All @@ -79,6 +83,7 @@ namespace r0
E* l;
E* r;
std::list<E*> get_childs() { return {l, r}; }
std::list<std::string> get_vars();
void uniquify(std::unordered_map<std::string, std::string>);
int t_check(std::unordered_map<std::string , int>&);
c0::Arg* to_c0(std::unordered_map<std::string, int> &vars,
Expand All @@ -95,6 +100,7 @@ namespace r0
u_ops op;
E* v;
std::list<E*> get_childs() { return {v}; }
std::list<std::string> get_vars();
void uniquify(std::unordered_map<std::string, std::string>);
int t_check(std::unordered_map<std::string , int>&);
c0::Arg* to_c0(std::unordered_map<std::string, int> &vars,
Expand All @@ -111,6 +117,7 @@ namespace r0
Var(std::string varname, int t) : name(varname) { this->t = t; }
std::string name;
std::list<E*> get_childs() { return {}; }
std::list<std::string> get_vars() { return {name}; }
void uniquify(std::unordered_map<std::string, std::string>);
int t_check(std::unordered_map<std::string , int>&);
c0::Arg* to_c0(std::unordered_map<std::string, int> &vars,
Expand All @@ -127,6 +134,7 @@ namespace r0
GlobalVar(std::string varname) { name = varname; }
std::string name;
std::list<E*> get_childs() { return {}; }
std::list<std::string> get_vars() { return {}; }
void uniquify(std::unordered_map<std::string, std::string>);
int t_check(std::unordered_map<std::string , int>&);
c0::Arg* to_c0(std::unordered_map<std::string, int> &vars,
Expand All @@ -150,6 +158,7 @@ namespace r0
E* func;
std::list<E*> args;
std::list<E*> get_childs() { return args; }
std::list<std::string> get_vars();
// an extra t is necessary because we use existing t to check for first
// initialization on type_check, so t has to remain TUNKNOWN until
// type_check runs at least once
Expand All @@ -171,6 +180,7 @@ namespace r0
E* ve;
E* be;
std::list<E*> get_childs() { return {ve, be}; }
std::list<std::string> get_vars();
void uniquify(std::unordered_map<std::string, std::string>);
int t_check(std::unordered_map<std::string , int>&);
c0::Arg* to_c0(std::unordered_map<std::string, int> &vars,
Expand All @@ -188,6 +198,7 @@ namespace r0
E* thene;
E* elsee;
std::list<E*> get_childs() { return { conde, thene, elsee}; }
std::list<std::string> get_vars();
void uniquify(std::unordered_map<std::string, std::string>);
int t_check(std::unordered_map<std::string, int>&);
c0::Arg* to_c0(std::unordered_map<std::string, int> &vars,
Expand All @@ -204,6 +215,7 @@ namespace r0
Vector(std::list<E*> ee) : elist(ee) { }
std::list<E*> elist;
std::list<E*> get_childs() { return elist; }
std::list<std::string> get_vars();
void uniquify(std::unordered_map<std::string, std::string>);
int t_check(std::unordered_map<std::string, int>&);
c0::Arg* to_c0(std::unordered_map<std::string, int> &vars,
Expand All @@ -222,6 +234,7 @@ namespace r0
E* vec;
int index;
std::list<E*> get_childs() { return { vec }; }
std::list<std::string> get_vars();
void uniquify(std::unordered_map<std::string, std::string> m) { vec->uniquify(m); }
int t_check(std::unordered_map<std::string, int>&);
c0::Arg* to_c0(std::unordered_map<std::string, int> &vars,
Expand All @@ -239,6 +252,7 @@ namespace r0
int index;
E* asg;
std::list<E*> get_childs() { return { vec, asg }; }
std::list<std::string> get_vars();
void uniquify(std::unordered_map<std::string, std::string> m) { vec->uniquify(m); asg->uniquify(m); }
int t_check(std::unordered_map<std::string, int>&);
c0::Arg* to_c0(std::unordered_map<std::string, int> &vars,
Expand All @@ -255,6 +269,7 @@ namespace r0
std::vector<std::string> args;
E* body;
std::list<E*> get_childs() { return { body }; }
std::list<std::string> get_vars();
void uniquify(std::unordered_map<std::string, std::string> m);
int t_check(std::unordered_map<std::string, int>&);
c0::Arg* to_c0(std::unordered_map<std::string, int> &vars,
Expand All @@ -270,6 +285,7 @@ namespace r0
struct Sugar : E
{
std::list<E*> get_childs();
std::list<std::string> get_vars();
void uniquify(std::unordered_map<std::string, std::string>);
int t_check(std::unordered_map<std::string, int>&);
c0::Arg* to_c0(std::unordered_map<std::string, int> &vars,
Expand Down

0 comments on commit 85b7fd6

Please sign in to comment.