From 9049aa1f654b86f8079afbbdd973878051e5e69b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Lindqvist?= Date: Wed, 29 Jul 2015 16:33:59 +0200 Subject: [PATCH] VM: another opportunity to use a lambda function over a struct --- vm/free_list_allocator.hpp | 35 ++++++++++++----------------------- 1 file changed, 12 insertions(+), 23 deletions(-) diff --git a/vm/free_list_allocator.hpp b/vm/free_list_allocator.hpp index ac222156a4..65e6851d9e 100644 --- a/vm/free_list_allocator.hpp +++ b/vm/free_list_allocator.hpp @@ -125,38 +125,27 @@ template void free_list_allocator::sweep() { sweep(null_sweep); } -template struct heap_compactor { - mark_bits* state; - char* address; - Iterator& iter; - const Block** finger; - - heap_compactor(mark_bits* state, Block* address, - Iterator& iter, const Block** finger) - : state(state), address((char*)address), iter(iter), finger(finger) {} - - void operator()(Block* block, cell size) { - if (this->state->marked_p((cell)block)) { - *finger = (Block*)((cell)block + size); - memmove((Block*)address, block, size); - iter(block, (Block*)address, size); - address += size; - } - } -}; - /* The forwarding map must be computed first by calling state.compute_forwarding(). */ template template void free_list_allocator::compact(Iterator& iter, Fixup fixup, const Block** finger) { - heap_compactor compactor(&state, (Block*)start, iter, finger); - iterate(compactor, fixup); + cell dest_addr = start; + auto compact_block_func = [&](Block* block, cell size) { + cell block_addr = (cell)block; + if (!state.marked_p(block_addr)) + return; + *finger = (Block*)(block_addr + size); + memmove((Block*)dest_addr, block, size); + iter(block, (Block*)dest_addr, size); + dest_addr += size; + }; + iterate(compact_block_func, fixup); /* Now update the free list; there will be a single free block at the end */ - free_blocks.initial_free_list(start, end, (cell)compactor.address - start); + free_blocks.initial_free_list(start, end, dest_addr - start); } /* During compaction we have to be careful and measure object sizes