| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							|  |  |  | } |