2009-10-16 12:39:22 -04:00
|
|
|
namespace factor
|
|
|
|
{
|
|
|
|
|
|
|
|
struct callback {
|
|
|
|
cell size;
|
|
|
|
code_block *compiled;
|
|
|
|
void *code() { return (void *)(this + 1); }
|
|
|
|
};
|
|
|
|
|
|
|
|
struct callback_heap {
|
|
|
|
segment *seg;
|
|
|
|
cell here;
|
2009-10-18 21:31:59 -04:00
|
|
|
factor_vm *parent;
|
2009-10-16 12:39:22 -04:00
|
|
|
|
2009-10-18 21:31:59 -04:00
|
|
|
explicit callback_heap(cell size, factor_vm *parent);
|
2009-10-16 12:39:22 -04:00
|
|
|
~callback_heap();
|
|
|
|
|
2009-10-16 13:25:21 -04:00
|
|
|
callback *add(code_block *compiled);
|
2009-10-16 12:39:22 -04:00
|
|
|
void update(callback *stub);
|
|
|
|
|
|
|
|
callback *next(callback *stub)
|
|
|
|
{
|
|
|
|
return (callback *)((cell)stub + stub->size + sizeof(callback));
|
|
|
|
}
|
|
|
|
|
|
|
|
template<typename Iterator> void iterate(Iterator &iter)
|
|
|
|
{
|
|
|
|
callback *scan = (callback *)seg->start;
|
|
|
|
callback *end = (callback *)here;
|
|
|
|
while(scan < end)
|
|
|
|
{
|
|
|
|
iter(scan);
|
|
|
|
scan = next(scan);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
}
|