75 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
#include "master.hpp"
 | 
						|
 | 
						|
namespace factor
 | 
						|
{
 | 
						|
 | 
						|
old_space::old_space(cell size_, cell start_) : zone(size_,start_)
 | 
						|
{
 | 
						|
	object_start_offsets = new card[addr_to_card(size_)];
 | 
						|
	object_start_offsets_end = object_start_offsets + addr_to_card(size_);
 | 
						|
}
 | 
						|
 | 
						|
old_space::~old_space()
 | 
						|
{
 | 
						|
	delete[] object_start_offsets;
 | 
						|
}
 | 
						|
 | 
						|
cell old_space::first_object_in_card(cell card_index)
 | 
						|
{
 | 
						|
	return object_start_offsets[card_index];
 | 
						|
}
 | 
						|
 | 
						|
cell old_space::find_object_containing_card(cell card_index)
 | 
						|
{
 | 
						|
	if(card_index == 0)
 | 
						|
		return start;
 | 
						|
	else
 | 
						|
	{
 | 
						|
		card_index--;
 | 
						|
 | 
						|
		while(first_object_in_card(card_index) == card_starts_inside_object)
 | 
						|
		{
 | 
						|
#ifdef FACTOR_DEBUG
 | 
						|
			/* First card should start with an object */
 | 
						|
			assert(card_index > 0);
 | 
						|
#endif
 | 
						|
			card_index--;
 | 
						|
		}
 | 
						|
 | 
						|
		return start + (card_index << card_bits) + first_object_in_card(card_index);
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
/* we need to remember the first object allocated in the card */
 | 
						|
void old_space::record_object_start_offset(object *obj)
 | 
						|
{
 | 
						|
	cell idx = addr_to_card((cell)obj - start);
 | 
						|
	if(object_start_offsets[idx] == card_starts_inside_object)
 | 
						|
		object_start_offsets[idx] = ((cell)obj & addr_card_mask);
 | 
						|
}
 | 
						|
 | 
						|
object *old_space::allot(cell size)
 | 
						|
{
 | 
						|
	if(here + size > end) return NULL;
 | 
						|
 | 
						|
	object *obj = zone::allot(size);
 | 
						|
	record_object_start_offset(obj);
 | 
						|
	return obj;
 | 
						|
}
 | 
						|
 | 
						|
void old_space::clear_object_start_offsets()
 | 
						|
{
 | 
						|
	memset(object_start_offsets,card_starts_inside_object,addr_to_card(size));
 | 
						|
}
 | 
						|
 | 
						|
cell old_space::next_object_after(factor_vm *myvm, cell scan)
 | 
						|
{
 | 
						|
	cell size = myvm->untagged_object_size((object *)scan);
 | 
						|
	if(scan + size < here)
 | 
						|
		return scan + size;
 | 
						|
	else
 | 
						|
		return 0;
 | 
						|
}
 | 
						|
 | 
						|
}
 |