73 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			73 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
namespace factor
 | 
						|
{
 | 
						|
 | 
						|
/* generational copying GC divides memory into zones */
 | 
						|
struct zone {
 | 
						|
	/* allocation pointer is 'here'; its offset is hardcoded in the
 | 
						|
	compiler backends */
 | 
						|
	cell start;
 | 
						|
	cell here;
 | 
						|
	cell size;
 | 
						|
	cell end;
 | 
						|
	
 | 
						|
	cell init_zone(cell size_, cell start_)
 | 
						|
	{
 | 
						|
		size = size_;
 | 
						|
		start = here = start_;
 | 
						|
		end = start_ + size_;
 | 
						|
		return end;
 | 
						|
	}
 | 
						|
};
 | 
						|
 | 
						|
struct data_heap {
 | 
						|
	segment *seg;
 | 
						|
 | 
						|
	cell young_size;
 | 
						|
	cell aging_size;
 | 
						|
	cell tenured_size;
 | 
						|
 | 
						|
	cell gen_count;
 | 
						|
 | 
						|
	zone *generations;
 | 
						|
	zone *semispaces;
 | 
						|
 | 
						|
	char *allot_markers;
 | 
						|
	char *allot_markers_end;
 | 
						|
 | 
						|
	char *cards;
 | 
						|
	char *cards_end;
 | 
						|
 | 
						|
	char *decks;
 | 
						|
	char *decks_end;
 | 
						|
	
 | 
						|
	/* the 0th generation is where new objects are allocated. */
 | 
						|
	cell nursery() { return 0; }
 | 
						|
	
 | 
						|
	/* where objects hang around */
 | 
						|
	cell aging() { return gen_count - 2; }
 | 
						|
	
 | 
						|
	/* the oldest generation */
 | 
						|
	cell tenured() { return gen_count - 1; }
 | 
						|
	
 | 
						|
	bool have_aging_p() { return gen_count > 2; }
 | 
						|
 | 
						|
	data_heap(factor_vm *myvm, cell gen_count, cell young_size, cell aging_size, cell tenured_size);
 | 
						|
	~data_heap();
 | 
						|
};
 | 
						|
 | 
						|
static const cell max_gen_count = 3;
 | 
						|
 | 
						|
inline static bool in_zone(zone *z, object *pointer)
 | 
						|
{
 | 
						|
	return (cell)pointer >= z->start && (cell)pointer < z->end;
 | 
						|
}
 | 
						|
 | 
						|
PRIMITIVE(data_room);
 | 
						|
PRIMITIVE(size);
 | 
						|
 | 
						|
PRIMITIVE(begin_scan);
 | 
						|
PRIMITIVE(next_object);
 | 
						|
PRIMITIVE(end_scan);
 | 
						|
 | 
						|
}
 |