40 lines
		
	
	
		
			885 B
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			40 lines
		
	
	
		
			885 B
		
	
	
	
		
			C++
		
	
	
namespace factor {
 | 
						|
 | 
						|
struct from_tenured_refs_copier : no_fixup {
 | 
						|
  tenured_space* tenured;
 | 
						|
  std::vector<cell> *mark_stack;
 | 
						|
 | 
						|
  from_tenured_refs_copier(tenured_space* tenured,
 | 
						|
                           std::vector<cell> *mark_stack)
 | 
						|
      : tenured(tenured), mark_stack(mark_stack) { }
 | 
						|
 | 
						|
  object* fixup_data(object* obj) {
 | 
						|
    if (tenured->contains_p(obj)) {
 | 
						|
      return obj;
 | 
						|
    }
 | 
						|
 | 
						|
    // Is there another forwarding pointer?
 | 
						|
    while (obj->forwarding_pointer_p()) {
 | 
						|
      object* dest = obj->forwarding_pointer();
 | 
						|
      obj = dest;
 | 
						|
    }
 | 
						|
 | 
						|
    if (tenured->contains_p(obj)) {
 | 
						|
      return obj;
 | 
						|
    }
 | 
						|
 | 
						|
    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;
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
}
 |