| 
									
										
										
										
											2013-05-11 22:07:15 -04:00
										 |  |  | namespace factor { | 
					
						
							| 
									
										
										
										
											2009-05-04 02:46:13 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-02 10:19:09 -04:00
										 |  |  | struct jit { | 
					
						
							| 
									
										
										
										
											2013-05-11 22:07:15 -04:00
										 |  |  |   data_root<object> owner; | 
					
						
							|  |  |  |   growable_byte_array code; | 
					
						
							|  |  |  |   growable_byte_array relocation; | 
					
						
							|  |  |  |   growable_array parameters; | 
					
						
							|  |  |  |   growable_array literals; | 
					
						
							|  |  |  |   bool computing_offset_p; | 
					
						
							|  |  |  |   fixnum position; | 
					
						
							|  |  |  |   cell offset; | 
					
						
							|  |  |  |   factor_vm* parent; | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-19 03:28:59 -04:00
										 |  |  |   jit(cell owner, factor_vm* parent); | 
					
						
							| 
									
										
										
										
											2013-05-11 22:07:15 -04:00
										 |  |  |   ~jit(); | 
					
						
							| 
									
										
										
										
											2011-11-02 02:40:46 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-11 22:07:15 -04:00
										 |  |  |   void compute_position(cell offset); | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-11 22:07:15 -04:00
										 |  |  |   void emit_relocation(cell relocation_template); | 
					
						
							|  |  |  |   void emit(cell code_template); | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-21 10:26:04 -04:00
										 |  |  |   // Allocates memory
 | 
					
						
							| 
									
										
										
										
											2013-05-11 22:07:15 -04:00
										 |  |  |   void parameter(cell parameter) { parameters.add(parameter); } | 
					
						
							| 
									
										
										
										
											2016-08-21 10:26:04 -04:00
										 |  |  |   // Allocates memory
 | 
					
						
							| 
									
										
										
										
											2013-05-11 22:07:15 -04:00
										 |  |  |   void emit_with_parameter(cell code_template_, cell parameter_); | 
					
						
							| 
									
										
										
										
											2009-12-02 05:28:15 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-21 10:26:04 -04:00
										 |  |  |   // Allocates memory
 | 
					
						
							| 
									
										
										
										
											2013-05-11 22:07:15 -04:00
										 |  |  |   void literal(cell literal) { literals.add(literal); } | 
					
						
							| 
									
										
										
										
											2016-08-21 10:26:04 -04:00
										 |  |  |   // Allocates memory
 | 
					
						
							| 
									
										
										
										
											2013-05-11 22:07:15 -04:00
										 |  |  |   void emit_with_literal(cell code_template_, cell literal_); | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-21 10:26:04 -04:00
										 |  |  |   // Allocates memory
 | 
					
						
							| 
									
										
										
										
											2013-05-11 22:07:15 -04:00
										 |  |  |   void push(cell literal) { | 
					
						
							| 
									
										
										
										
											2016-06-07 08:54:23 -04:00
										 |  |  |     emit_with_literal(parent->special_objects[JIT_PUSH_LITERAL], literal); | 
					
						
							| 
									
										
										
										
											2013-05-11 22:07:15 -04:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-11 22:07:15 -04:00
										 |  |  |   bool emit_subprimitive(cell word_, bool tail_call_p, bool stack_frame_p); | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-11 22:07:15 -04:00
										 |  |  |   fixnum get_position() { | 
					
						
							|  |  |  |     if (computing_offset_p) { | 
					
						
							| 
									
										
										
										
											2016-08-21 10:26:04 -04:00
										 |  |  |       // If this is still on, emit() didn't clear it,
 | 
					
						
							|  |  |  |       // so the offset was out of bounds
 | 
					
						
							| 
									
										
										
										
											2013-05-11 22:07:15 -04:00
										 |  |  |       return -1; | 
					
						
							| 
									
										
										
										
											2016-05-29 21:03:10 -04:00
										 |  |  |     } | 
					
						
							|  |  |  |     return position; | 
					
						
							| 
									
										
										
										
											2013-05-11 22:07:15 -04:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-11 22:07:15 -04:00
										 |  |  |   void set_position(fixnum position_) { | 
					
						
							|  |  |  |     if (computing_offset_p) | 
					
						
							|  |  |  |       position = position_; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-19 03:28:59 -04:00
										 |  |  |   code_block* to_code_block(code_block_type type, cell frame_size); | 
					
						
							| 
									
										
										
										
											2011-11-02 02:40:46 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							| 
									
										
										
										
											2013-05-11 22:07:15 -04:00
										 |  |  |   jit(const jit&); | 
					
						
							|  |  |  |   void operator=(const jit&); | 
					
						
							| 
									
										
										
										
											2009-05-02 10:19:09 -04:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2009-05-04 02:46:13 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | } |