trying to remove cell from register

This commit is contained in:
IXtreme 2026-07-10 22:31:08 -04:00
parent 2c64b5b231
commit 88bfe4697b

View file

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