diff --git a/vm/code_heap.cpp b/vm/code_heap.cpp index f98ebb5fd9..8ac29fd6b5 100755 --- a/vm/code_heap.cpp +++ b/vm/code_heap.cpp @@ -72,8 +72,31 @@ void code_heap::flush_icache() factor::flush_icache(seg->start,seg->size); } +struct all_blocks_set_verifier { + std::set *leftovers; + + all_blocks_set_verifier(std::set *leftovers) : leftovers(leftovers) {} + + void operator()(code_block *block, cell size) + { + FACTOR_ASSERT(leftovers->find(block) != leftovers->end()); + leftovers->erase(block); + } +}; + +void code_heap::verify_all_blocks_set() +{ + std::set leftovers = all_blocks; + all_blocks_set_verifier verifier(&leftovers); + allocator->iterate(verifier); + FACTOR_ASSERT(leftovers.empty()); +} + code_block *code_heap::code_block_for_address(cell address) { +#ifdef FACTOR_DEBUG + verify_all_blocks_set(); +#endif std::set::const_iterator blocki = all_blocks.upper_bound((code_block*)address); FACTOR_ASSERT(blocki != all_blocks.begin()); diff --git a/vm/code_heap.hpp b/vm/code_heap.hpp index ac1df6a292..0fe56e9aa0 100755 --- a/vm/code_heap.hpp +++ b/vm/code_heap.hpp @@ -47,6 +47,7 @@ struct code_heap { void flush_icache(); void guard_safepoint(); void unguard_safepoint(); + void verify_all_blocks_set(); void initialize_all_blocks_set(); void update_all_blocks_set(mark_bits *code_forwarding_map);