| 
									
										
										
										
											2013-05-11 22:29:54 -04:00
										 |  |  | namespace factor { | 
					
						
							| 
									
										
										
										
											2009-10-07 16:48:09 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-22 06:35:38 -04:00
										 |  |  | struct from_tenured_refs_copier : no_fixup { | 
					
						
							| 
									
										
										
										
											2013-05-11 22:29:54 -04:00
										 |  |  |   tenured_space* tenured; | 
					
						
							| 
									
										
										
										
											2016-09-22 06:35:38 -04:00
										 |  |  |   std::vector<cell> *mark_stack; | 
					
						
							| 
									
										
										
										
											2009-10-07 16:48:09 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-22 06:35:38 -04:00
										 |  |  |   from_tenured_refs_copier(tenured_space* tenured, | 
					
						
							|  |  |  |                            std::vector<cell> *mark_stack) | 
					
						
							|  |  |  |       : tenured(tenured), mark_stack(mark_stack) { } | 
					
						
							| 
									
										
										
										
											2009-10-07 16:48:09 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-22 06:35:38 -04:00
										 |  |  |   object* fixup_data(object* obj) { | 
					
						
							|  |  |  |     if (tenured->contains_p(obj)) { | 
					
						
							|  |  |  |       return obj; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-10-20 23:20:49 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-22 06:35:38 -04:00
										 |  |  |     // Is there another forwarding pointer?
 | 
					
						
							|  |  |  |     while (obj->forwarding_pointer_p()) { | 
					
						
							|  |  |  |       object* dest = obj->forwarding_pointer(); | 
					
						
							|  |  |  |       obj = dest; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (tenured->contains_p(obj)) { | 
					
						
							|  |  |  |       return obj; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-10-20 23:20:49 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-22 06:35:38 -04:00
										 |  |  |     cell size = obj->size(); | 
					
						
							|  |  |  |     object* newpointer = tenured->allot(size); | 
					
						
							|  |  |  |     if (!newpointer) | 
					
						
							|  |  |  |       throw must_start_gc_again(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     memcpy(newpointer, obj, size); | 
					
						
							|  |  |  |     obj->forward_to(newpointer); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     mark_stack->push_back((cell)newpointer); | 
					
						
							|  |  |  |     return newpointer; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2009-10-07 16:48:09 -04:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |