factor/vm/contexts.hpp

85 lines
1.7 KiB
C++
Raw Normal View History

2009-05-04 02:46:13 -04:00
namespace factor
{
// Context object count and identifiers must be kept in sync with:
// core/kernel/kernel.factor
static const cell context_object_count = 10;
enum context_object {
OBJ_NAMESTACK,
OBJ_CATCHSTACK,
2010-04-01 22:12:45 -04:00
OBJ_CONTEXT,
OBJ_IN_CALLBACK_P,
};
2010-03-27 07:33:28 -04:00
static const cell stack_reserved = 1024;
2009-05-04 05:50:24 -04:00
struct context {
// First 4 fields accessed directly by compiler. See basis/vm/vm.factor
/* Factor callstack pointers */
void *callstack_top;
void *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;
/* C callstack pointer */
cell callstack_save;
segment *datastack_seg;
segment *retainstack_seg;
segment *callstack_seg;
2010-04-02 15:42:29 -04:00
/* context-specific special objects, accessed by context-object and
set-context-object primitives */
cell context_objects[context_object_count];
context(cell datastack_size, cell retainstack_size, cell callstack_size);
~context();
2009-11-08 20:44:18 -05:00
void reset_datastack();
void reset_retainstack();
void reset_callstack();
void reset_context_objects();
void reset();
2010-03-27 07:33:28 -04:00
void fix_stacks();
void scrub_stacks(gc_info *info, cell index);
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);
}
};
VM_C_API context *new_context(factor_vm *parent);
VM_C_API void delete_context(factor_vm *parent, context *old_context);
VM_C_API void reset_context(factor_vm *parent, context *ctx);
2010-04-01 22:12:45 -04:00
VM_C_API cell begin_callback(factor_vm *parent, cell quot);
VM_C_API void end_callback(factor_vm *parent);
2009-05-04 02:46:13 -04:00
}