factor/vm/contexts.hpp

59 lines
1.3 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:
- callstack_top field is 0
- callstack_bottom field is 1
- datastack field is 2
- retainstack field is 3 */
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;
/* saved contents of ds register on entry to callback */
2009-05-04 05:50:24 -04:00
cell datastack_save;
/* saved contents of rs register on entry to callback */
2009-05-04 05:50:24 -04:00
cell retainstack_save;
/* 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;
/* saved userenv 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;
};
#define ds_bot (stack_chain->datastack_region->start)
#define ds_top (stack_chain->datastack_region->end)
#define rs_bot (stack_chain->retainstack_region->start)
#define rs_top (stack_chain->retainstack_region->end)
DEFPUSHPOP(d,ds)
DEFPUSHPOP(r,rs)
PRIMITIVE(datastack);
PRIMITIVE(retainstack);
PRIMITIVE(set_datastack);
PRIMITIVE(set_retainstack);
PRIMITIVE(check_datastack);
2009-08-23 14:40:59 -04:00
struct factorvm;
VM_C_API void nest_stacks(factorvm *vm);
VM_C_API void unnest_stacks(factorvm *vm);
2009-05-04 02:46:13 -04:00
}