factor/vm/contexts.hpp

81 lines
1.5 KiB
C++
Raw Normal View History

2009-05-04 02:46:13 -04:00
namespace factor
{
/* Assembly code makes assumptions about the layout of this struct */
2009-05-04 05:50:24 -04:00
struct context {
/* C stack pointer on entry */
2009-05-04 05:50:24 -04:00
stack_frame *callstack_top;
stack_frame *callstack_bottom;
/* current datastack top pointer */
2009-05-04 05:50:24 -04:00
cell datastack;
/* current retain stack top pointer */
2009-05-04 05:50:24 -04:00
cell retainstack;
/* memory region holding current datastack */
2009-05-04 05:50:24 -04:00
segment *datastack_region;
/* memory region holding current retain stack */
2009-05-04 05:50:24 -04:00
segment *retainstack_region;
2009-10-23 01:33:53 -04:00
/* saved special_objects slots on entry to callback */
2009-05-04 05:50:24 -04:00
cell catchstack_save;
cell current_callback_save;
2009-05-04 05:50:24 -04:00
context *next;
2009-11-08 20:44:18 -05:00
context(cell ds_size, cell rs_size);
2009-12-04 20:56:48 -05:00
cell peek()
{
return *(cell *)datastack;
}
void replace(cell tagged)
{
*(cell *)datastack = tagged;
}
cell pop()
{
cell value = peek();
datastack -= sizeof(cell);
return value;
}
void push(cell tagged)
{
datastack += sizeof(cell);
replace(tagged);
}
void reset_datastack()
{
datastack = datastack_region->start - sizeof(cell);
}
void reset_retainstack()
{
retainstack = retainstack_region->start - sizeof(cell);
}
static const cell stack_reserved = (64 * sizeof(cell));
void fix_stacks()
{
if(datastack + sizeof(cell) < datastack_region->start
|| datastack + stack_reserved >= datastack_region->end)
reset_datastack();
if(retainstack + sizeof(cell) < retainstack_region->start
|| retainstack + stack_reserved >= retainstack_region->end)
reset_retainstack();
}
};
VM_C_API void nest_stacks(factor_vm *vm);
2009-09-23 14:05:46 -04:00
VM_C_API void unnest_stacks(factor_vm *vm);
2009-05-04 02:46:13 -04:00
}