VM: move free_list_allocator<Block>::next_allocated_block_after to

tenured_space::next_allocated_object_after, because it's only used there
db4
Björn Lindqvist 2015-05-30 20:07:16 +02:00
parent f1ca83524a
commit a0e7bb8770
2 changed files with 17 additions and 27 deletions

View File

@ -18,7 +18,6 @@ template <typename Block> struct free_list_allocator {
free_list_allocator(cell size, cell start); free_list_allocator(cell size, cell start);
void initial_free_list(cell occupied); void initial_free_list(cell occupied);
bool contains_p(Block* block); bool contains_p(Block* block);
Block* next_allocated_block_after(Block* block);
bool can_allot_p(cell size); bool can_allot_p(cell size);
Block* allot(cell size); Block* allot(cell size);
void free(Block* block); void free(Block* block);
@ -55,19 +54,6 @@ bool free_list_allocator<Block>::contains_p(Block* block) {
return ((cell)block - start) < size; return ((cell)block - start) < size;
} }
template <typename Block>
Block* free_list_allocator<Block>::next_allocated_block_after(Block* block) {
while ((cell)block != this->end && block->free_p()) {
free_heap_block* free_block = (free_heap_block*)block;
block = (Block*)((cell)free_block + free_block->size());
}
if ((cell)block == this->end)
return NULL;
else
return block;
}
template <typename Block> template <typename Block>
bool free_list_allocator<Block>::can_allot_p(cell size) { bool free_list_allocator<Block>::can_allot_p(cell size) {
return free_blocks.can_allot_p(size); return free_blocks.can_allot_p(size);
@ -155,7 +141,7 @@ template <typename Block, typename Iterator> struct heap_compactor {
void operator()(Block* block, cell size) { void operator()(Block* block, cell size) {
if (this->state->marked_p((cell)block)) { if (this->state->marked_p((cell)block)) {
*finger = (Block*)((char*)block + size); *finger = (Block*)((cell)block + size);
memmove((Block*)address, block, size); memmove((Block*)address, block, size);
iter(block, (Block*)address, size); iter(block, (Block*)address, size);
address += size; address += size;
@ -182,15 +168,12 @@ void free_list_allocator<Block>::compact(Iterator& iter, Fixup fixup,
template <typename Block> template <typename Block>
template <typename Iterator, typename Fixup> template <typename Iterator, typename Fixup>
void free_list_allocator<Block>::iterate(Iterator& iter, Fixup fixup) { void free_list_allocator<Block>::iterate(Iterator& iter, Fixup fixup) {
Block* scan = (Block*)this->start; cell scan = this->start;
Block* end = (Block*)this->end; while (scan != this->end) {
cell size = fixup.size((Block*)scan);
while (scan != end) { if (!((Block*)scan)->free_p())
cell size = fixup.size(scan); iter((Block*)scan, size);
Block* next = (Block*)((cell)scan + size); scan += size;
if (!scan->free_p())
iter(scan, size);
scan = next;
} }
} }

View File

@ -15,14 +15,21 @@ struct tenured_space : free_list_allocator<object> {
return NULL; return NULL;
} }
cell next_allocated_object_after(cell scan) {
while (scan != this->end && ((object*)scan)->free_p()) {
free_heap_block* free_block = (free_heap_block*)scan;
scan = (cell)free_block + free_block->size();
}
return scan == this->end ? 0 : scan;
}
cell first_object() { cell first_object() {
return (cell)next_allocated_block_after((object*)this->start); return next_allocated_object_after(this->start);
} }
cell next_object_after(cell scan) { cell next_object_after(cell scan) {
cell size = ((object*)scan)->size(); cell size = ((object*)scan)->size();
object* next = (object*)(scan + size); return next_allocated_object_after(scan + size);
return (cell)next_allocated_block_after(next);
} }
void sweep() { void sweep() {