diff --git a/vm/free_list_allocator.hpp b/vm/free_list_allocator.hpp index 165a65591d..eed481120a 100644 --- a/vm/free_list_allocator.hpp +++ b/vm/free_list_allocator.hpp @@ -18,7 +18,6 @@ template struct free_list_allocator { free_list_allocator(cell size, cell start); void initial_free_list(cell occupied); bool contains_p(Block* block); - Block* next_allocated_block_after(Block* block); bool can_allot_p(cell size); Block* allot(cell size); void free(Block* block); @@ -55,19 +54,6 @@ bool free_list_allocator::contains_p(Block* block) { return ((cell)block - start) < size; } -template -Block* free_list_allocator::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 bool free_list_allocator::can_allot_p(cell size) { return free_blocks.can_allot_p(size); @@ -155,7 +141,7 @@ template struct heap_compactor { void operator()(Block* block, cell size) { if (this->state->marked_p((cell)block)) { - *finger = (Block*)((char*)block + size); + *finger = (Block*)((cell)block + size); memmove((Block*)address, block, size); iter(block, (Block*)address, size); address += size; @@ -182,15 +168,12 @@ void free_list_allocator::compact(Iterator& iter, Fixup fixup, template template void free_list_allocator::iterate(Iterator& iter, Fixup fixup) { - Block* scan = (Block*)this->start; - Block* end = (Block*)this->end; - - while (scan != end) { - cell size = fixup.size(scan); - Block* next = (Block*)((cell)scan + size); - if (!scan->free_p()) - iter(scan, size); - scan = next; + cell scan = this->start; + while (scan != this->end) { + cell size = fixup.size((Block*)scan); + if (!((Block*)scan)->free_p()) + iter((Block*)scan, size); + scan += size; } } diff --git a/vm/tenured_space.hpp b/vm/tenured_space.hpp index 33ed45df47..5d06683677 100644 --- a/vm/tenured_space.hpp +++ b/vm/tenured_space.hpp @@ -15,14 +15,21 @@ struct tenured_space : free_list_allocator { 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() { - return (cell)next_allocated_block_after((object*)this->start); + return next_allocated_object_after(this->start); } cell next_object_after(cell scan) { cell size = ((object*)scan)->size(); - object* next = (object*)(scan + size); - return (cell)next_allocated_block_after(next); + return next_allocated_object_after(scan + size); } void sweep() {