factor/vm/old_space.cpp

55 lines
1.1 KiB
C++
Raw Normal View History

#include "master.hpp"
namespace factor
{
old_space::old_space(cell size_, cell start_) : zone(size_,start_)
{
cell cards_size = size_ >> card_bits;
allot_markers = new card[cards_size];
allot_markers_end = allot_markers + cards_size;
}
old_space::~old_space()
{
delete[] allot_markers;
}
card *old_space::addr_to_allot_marker(object *a)
{
return (card *)((((cell)a - start) >> card_bits) + (cell)allot_markers);
}
/* we need to remember the first object allocated in the card */
void old_space::record_allocation(object *obj)
{
card *ptr = addr_to_allot_marker(obj);
if(*ptr == invalid_allot_marker)
*ptr = ((cell)obj & addr_card_mask);
}
object *old_space::allot(cell size)
{
if(here + size > end) return NULL;
object *obj = zone::allot(size);
record_allocation(obj);
return obj;
}
void old_space::clear_allot_markers()
{
memset(allot_markers,invalid_allot_marker,size >> card_bits);
}
cell old_space::next_object_after(factor_vm *myvm, cell scan)
{
cell size = myvm->untagged_object_size((object *)scan);
if(scan + size < end)
return scan + size;
else
return NULL;
}
}