76 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
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,
 | 
						|
  OBJ_CONTEXT,
 | 
						|
  OBJ_IN_CALLBACK_P,
 | 
						|
};
 | 
						|
 | 
						|
static const cell stack_reserved = 1024;
 | 
						|
 | 
						|
struct context {
 | 
						|
 | 
						|
  // First 4 fields accessed directly by compiler. See basis/vm/vm.factor
 | 
						|
 | 
						|
  /* Factor callstack pointers */
 | 
						|
  cell callstack_top;
 | 
						|
  cell callstack_bottom;
 | 
						|
 | 
						|
  /* current datastack top pointer */
 | 
						|
  cell datastack;
 | 
						|
 | 
						|
  /* current retain stack top pointer */
 | 
						|
  cell retainstack;
 | 
						|
 | 
						|
  /* C callstack pointer */
 | 
						|
  cell callstack_save;
 | 
						|
 | 
						|
  segment* datastack_seg;
 | 
						|
  segment* retainstack_seg;
 | 
						|
  segment* callstack_seg;
 | 
						|
 | 
						|
  /* 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();
 | 
						|
 | 
						|
  void reset_datastack();
 | 
						|
  void reset_retainstack();
 | 
						|
  void reset_callstack();
 | 
						|
  void reset_context_objects();
 | 
						|
  void reset();
 | 
						|
  void fix_stacks();
 | 
						|
  void fill_stack_seg(cell top_ptr, segment* seg, cell pattern);
 | 
						|
 | 
						|
  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);
 | 
						|
VM_C_API void reset_context(factor_vm* parent);
 | 
						|
VM_C_API cell begin_callback(factor_vm* parent, cell quot);
 | 
						|
VM_C_API void end_callback(factor_vm* parent);
 | 
						|
 | 
						|
}
 |