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 */
 | |
|   void* callstack_top;
 | |
|   void* 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 scrub_stacks(gc_info* info, cell index);
 | |
| 
 | |
|   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);
 | |
| VM_C_API cell begin_callback(factor_vm* parent, cell quot);
 | |
| VM_C_API void end_callback(factor_vm* parent);
 | |
| 
 | |
| }
 |