67 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
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 */
 | 
						|
struct context {
 | 
						|
	/* C stack pointer on entry */
 | 
						|
	stack_frame *callstack_top;
 | 
						|
	stack_frame *callstack_bottom;
 | 
						|
 | 
						|
	/* current datastack top pointer */
 | 
						|
	cell datastack;
 | 
						|
 | 
						|
	/* current retain stack top pointer */
 | 
						|
	cell retainstack;
 | 
						|
 | 
						|
	/* saved contents of ds register on entry to callback */
 | 
						|
	cell datastack_save;
 | 
						|
 | 
						|
	/* saved contents of rs register on entry to callback */
 | 
						|
	cell retainstack_save;
 | 
						|
 | 
						|
	/* memory region holding current datastack */
 | 
						|
	segment *datastack_region;
 | 
						|
 | 
						|
	/* memory region holding current retain stack */
 | 
						|
	segment *retainstack_region;
 | 
						|
 | 
						|
	/* saved userenv slots on entry to callback */
 | 
						|
	cell catchstack_save;
 | 
						|
	cell current_callback_save;
 | 
						|
 | 
						|
	context *next;
 | 
						|
};
 | 
						|
 | 
						|
extern cell ds_size, rs_size;
 | 
						|
 | 
						|
#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)
 | 
						|
 | 
						|
void reset_datastack();
 | 
						|
void reset_retainstack();
 | 
						|
void fix_stacks();
 | 
						|
void init_stacks(cell ds_size, cell rs_size);
 | 
						|
 | 
						|
PRIMITIVE(datastack);
 | 
						|
PRIMITIVE(retainstack);
 | 
						|
PRIMITIVE(set_datastack);
 | 
						|
PRIMITIVE(set_retainstack);
 | 
						|
PRIMITIVE(check_datastack);
 | 
						|
 | 
						|
VM_C_API void save_stacks();
 | 
						|
VM_C_API void nest_stacks();
 | 
						|
VM_C_API void unnest_stacks();
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
VM_C_API factor::context *stack_chain;
 |