}
};
-void factor_vm::relocate_code_heap()
-{
- code_heap_relocator relocator(this);
- code->allocator->sweep(relocator);
-}
-
void factor_vm::primitive_modify_code_heap()
{
data_root<array> alist(dpop(),this);
cell largest_free_block();
cell free_block_count();
void sweep();
- template<typename Iterator> void sweep(Iterator &iter);
template<typename Iterator, typename Sizer> void compact(Iterator &iter, Sizer &sizer);
template<typename Iterator, typename Sizer> void iterate(Iterator &iter, Sizer &sizer);
template<typename Iterator> void iterate(Iterator &iter);
}
}
-template<typename Block>
-template<typename Iterator>
-void free_list_allocator<Block>::sweep(Iterator &iter)
-{
- free_blocks.clear_free_list();
-
- Block *prev = NULL;
- Block *scan = this->first_block();
- Block *end = this->last_block();
-
- while(scan != end)
- {
- cell size = scan->size();
-
- if(scan->free_p())
- {
- if(prev && prev->free_p())
- {
- free_heap_block *free_prev = (free_heap_block *)prev;
- free_prev->make_free(free_prev->size() + size);
- }
- else
- prev = scan;
- }
- else if(this->state.marked_p(scan))
- {
- if(prev && prev->free_p())
- free_blocks.add_to_free_list((free_heap_block *)prev);
- prev = scan;
- iter(scan,size);
- }
- else
- {
- if(prev && prev->free_p())
- {
- free_heap_block *free_prev = (free_heap_block *)prev;
- free_prev->make_free(free_prev->size() + size);
- }
- else
- {
- free_heap_block *free_block = (free_heap_block *)scan;
- free_block->make_free(size);
- prev = scan;
- }
- }
-
- scan = (Block *)((cell)scan + size);
- }
-
- if(prev && prev->free_p())
- free_blocks.add_to_free_list((free_heap_block *)prev);
-}
-
template<typename Block, typename Iterator> struct heap_compactor {
mark_bits<Block> *state;
char *address;
void jit_compile_word(cell word_, cell def_, bool relocate);
void update_code_heap_words();
void update_code_heap_words_and_literals();
- void relocate_code_heap();
void primitive_modify_code_heap();
code_heap_room code_room();
void primitive_code_room();