trying to remove cell from register
This commit is contained in:
parent
2c64b5b231
commit
88bfe4697b
1 changed files with 50 additions and 8 deletions
58
src/main.cpp
58
src/main.cpp
|
|
@ -65,8 +65,8 @@ struct Fork : Data {
|
|||
|
||||
struct Lambda : Data {
|
||||
Env env;
|
||||
Cell args;
|
||||
Cell f;
|
||||
size_t args;
|
||||
size_t f;
|
||||
};
|
||||
|
||||
enum class locs { EVAL_START, EVAL_OP_FIN, EVAL_TOP_ARG, APPLY };
|
||||
|
|
@ -101,13 +101,22 @@ struct Registers {
|
|||
struct Machine {
|
||||
size_t maxCells;
|
||||
size_t freepos = 1;
|
||||
std::vector<Cell> mem;
|
||||
size_t mempty_pos = 1;
|
||||
|
||||
|
||||
int activebank = 0;
|
||||
std::vector<Cell> bank0;
|
||||
std::vector<Cell> bank1;
|
||||
|
||||
std::vector<Cell>& mem;
|
||||
std::vector<Cell>& mem_empty;
|
||||
|
||||
|
||||
std::vector<Registers> stack;
|
||||
|
||||
Registers reg;
|
||||
|
||||
Machine(size_t max) : mem(max) {
|
||||
Machine(size_t max) : bank0(max) , bank1(max), mem(bank0), mem_empty(bank1) {
|
||||
maxCells = max;
|
||||
reg.E.builtin.insert("+");
|
||||
reg.E.builtin.insert("-");
|
||||
|
|
@ -259,7 +268,11 @@ struct Machine {
|
|||
}
|
||||
} else if (Lambda *f = dynamic_cast<Lambda *>(d)) {
|
||||
reg.A = f->args;
|
||||
reg.A = ((Fork *)(std::get<Cell>(reg.A)).d)->data;
|
||||
|
||||
reg.A = ((Fork *) mem[std::get<size_t>(reg.A)].d)->data;
|
||||
|
||||
|
||||
//reg.A = ( (Fork *) (std::get<Cell>(reg.A)).d) ->data;
|
||||
|
||||
reg.B = reg.args_front;
|
||||
// reg.E = f->env;
|
||||
|
|
@ -271,7 +284,11 @@ struct Machine {
|
|||
reg.B = mem[std::get<size_t>(reg.B)].cdr;
|
||||
}
|
||||
|
||||
reg.D = f->f.d;
|
||||
//reg.D = f->f.d;
|
||||
|
||||
reg.D = mem[f->f].d;
|
||||
|
||||
|
||||
//reg.E.userdef.merge(f->env.userdef);
|
||||
reg.RP = locs::EVAL_START;
|
||||
break;
|
||||
|
|
@ -336,8 +353,8 @@ struct Machine {
|
|||
|
||||
Lambda *l = new Lambda;
|
||||
l->env = reg.E;
|
||||
l->args = mem[cdr]; // mem[args->data];
|
||||
l->f = mem[mem[cdr].cdr]; // mem[f->data];
|
||||
l->args = cdr; // mem[args->data];
|
||||
l->f = mem[cdr].cdr; // mem[f->data];
|
||||
// std::cout <<"got lambd" << std::endl;
|
||||
return newCell(l);
|
||||
} else if (fname == "progn") {
|
||||
|
|
@ -393,6 +410,31 @@ struct Machine {
|
|||
return nc;
|
||||
}
|
||||
|
||||
|
||||
size_t newCellInEmpty() {
|
||||
if (mempty_pos >= maxCells) {
|
||||
throw "OOM in GC";
|
||||
}
|
||||
auto nc = mempty_pos;
|
||||
mempty_pos += 1;
|
||||
return nc;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// size_t MoveThingAtAddr(size_t loc) {
|
||||
// auto nc = newCellInEmpty();
|
||||
// mem_empty[nc] = mem[loc];
|
||||
// mem[loc].cdr = maxCells + nc;
|
||||
// return nc;
|
||||
// }
|
||||
|
||||
// // stop and copy gc
|
||||
// void GC() {
|
||||
// std::vector<
|
||||
|
||||
// }
|
||||
|
||||
size_t newCell(Data *d) {
|
||||
auto t = newCell();
|
||||
mem[t].d = d;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue