2013-05-11 21:53:18 -04:00
|
|
|
namespace factor {
|
2009-05-04 02:46:13 -04:00
|
|
|
|
2016-08-21 10:26:04 -04:00
|
|
|
// Context object count and identifiers must be kept in sync with:
|
|
|
|
// core/kernel/kernel.factor
|
2015-08-06 20:18:50 -04:00
|
|
|
static const cell context_object_count = 4;
|
2010-03-18 05:06:00 -04:00
|
|
|
|
|
|
|
enum context_object {
|
2013-05-11 21:53:18 -04:00
|
|
|
OBJ_NAMESTACK,
|
|
|
|
OBJ_CATCHSTACK,
|
|
|
|
OBJ_CONTEXT,
|
|
|
|
OBJ_IN_CALLBACK_P,
|
2010-03-18 05:06:00 -04:00
|
|
|
};
|
|
|
|
|
2016-08-21 10:26:04 -04:00
|
|
|
// When the callstack fills up (e.g by to deep recursion), a callstack
|
|
|
|
// overflow error is triggered. So before continuing executing on it
|
|
|
|
// in general_error(), we chop off this many bytes to have some space
|
|
|
|
// to work with. Mac OSX 64 bit needs more than 8192. See issue #1419.
|
2015-08-04 15:43:24 -04:00
|
|
|
static const cell stack_reserved = 16384;
|
2010-03-27 07:33:28 -04:00
|
|
|
|
2009-05-04 05:50:24 -04:00
|
|
|
struct context {
|
2010-03-26 22:44:43 -04:00
|
|
|
|
2016-08-21 10:26:04 -04:00
|
|
|
// First 5 fields accessed directly by compiler. See basis/vm/vm.factor
|
2013-05-11 21:53:18 -04:00
|
|
|
|
2016-08-21 10:26:04 -04:00
|
|
|
// Factor callstack pointers
|
2015-01-05 06:59:54 -05:00
|
|
|
cell callstack_top;
|
|
|
|
cell callstack_bottom;
|
2013-05-11 21:53:18 -04:00
|
|
|
|
2016-08-21 10:26:04 -04:00
|
|
|
// current datastack top pointer
|
2013-05-11 21:53:18 -04:00
|
|
|
cell datastack;
|
|
|
|
|
2016-08-21 10:26:04 -04:00
|
|
|
// current retain stack top pointer
|
2013-05-11 21:53:18 -04:00
|
|
|
cell retainstack;
|
|
|
|
|
2016-08-21 10:26:04 -04:00
|
|
|
// C callstack pointer
|
2013-05-11 21:53:18 -04:00
|
|
|
cell callstack_save;
|
|
|
|
|
|
|
|
segment* datastack_seg;
|
|
|
|
segment* retainstack_seg;
|
|
|
|
segment* callstack_seg;
|
|
|
|
|
2016-08-21 10:26:04 -04:00
|
|
|
// context-specific special objects, accessed by context-object and
|
|
|
|
// set-context-object primitives
|
2013-05-11 21:53:18 -04:00
|
|
|
cell context_objects[context_object_count];
|
|
|
|
|
2016-06-30 07:44:18 -04:00
|
|
|
context(cell ds_size, cell rs_size, cell cs_size);
|
2013-05-11 21:53:18 -04:00
|
|
|
~context();
|
|
|
|
|
|
|
|
void reset_datastack();
|
|
|
|
void reset_retainstack();
|
|
|
|
void reset_callstack();
|
|
|
|
void reset_context_objects();
|
|
|
|
void reset();
|
2014-12-04 14:45:13 -05:00
|
|
|
void fix_stacks();
|
2015-05-22 10:52:13 -04:00
|
|
|
void fill_stack_seg(cell top_ptr, segment* seg, cell pattern);
|
2015-08-03 17:48:08 -04:00
|
|
|
vm_error_type address_to_error(cell addr);
|
2013-05-11 21:53:18 -04: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);
|
|
|
|
}
|
2009-12-18 16:59:56 -05:00
|
|
|
};
|
2009-05-04 02:00:30 -04:00
|
|
|
|
2013-05-11 21:53:18 -04:00
|
|
|
VM_C_API context* new_context(factor_vm* parent);
|
2015-05-18 12:43:20 -04:00
|
|
|
VM_C_API void delete_context(factor_vm* parent);
|
|
|
|
VM_C_API void reset_context(factor_vm* parent);
|
2013-05-11 21:53:18 -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
|
|
|
|
|
|
|
}
|