for(cell i = 0; i < length; i++)
{
relocation_entry rel = relocation->data<relocation_entry>()[i];
- iter(rel,index,compiled,this);
+ (this->*iter)(rel,index,compiled);
index += number_of_parameters(relocation_type_of(rel));
}
}
{
if(!compiled->needs_fixup)
{
- iterate_relocations(compiled,factor::update_literal_references_step);
+ iterate_relocations(compiled,&factor_vm::update_literal_references_step);
flush_icache_for(compiled);
}
}
}
}
-void copy_literal_references(code_block *compiled, factor_vm *myvm)
-{
- return myvm->copy_literal_references(compiled);
-}
-
/* Compute an address to store at a relocation */
void factor_vm::relocate_code_block_step(relocation_entry rel, cell index, code_block *compiled)
{
code->heap_free(compiled);
else
{
- iterate_relocations(compiled,factor::update_word_references_step);
+ iterate_relocations(compiled,&factor_vm::update_word_references_step);
flush_icache_for(compiled);
}
}
{
compiled->last_scan = data->nursery();
compiled->needs_fixup = false;
- iterate_relocations(compiled,factor::relocate_code_block_step);
+ iterate_relocations(compiled,&factor_vm::relocate_code_block_step);
flush_icache_for(compiled);
}
/* code relocation table consists of a table of entries for each fixup */
typedef u32 relocation_entry;
-struct factor_vm;
-
-typedef void (*relocation_iterator)(relocation_entry rel, cell index, code_block *compiled, factor_vm *vm);
-
-// callback functions
-void relocate_code_block(code_block *compiled, factor_vm *myvm);
-void copy_literal_references(code_block *compiled, factor_vm *myvm);
-void update_word_references(code_block *compiled, factor_vm *myvm);
-void update_literal_and_word_references(code_block *compiled, factor_vm *myvm);
-
}
while(scan)
{
if(scan->status != B_FREE)
- iter((code_block *)scan,this);
+ (this->*iter)((code_block *)scan);
scan = code->next_block(scan);
}
}
aging and nursery collections */
void factor_vm::copy_code_heap_roots()
{
- iterate_code_heap(factor::copy_literal_references);
+ iterate_code_heap(&factor_vm::copy_literal_references);
}
/* Update pointers to words referenced from all code blocks. Only after
defining a new word. */
void factor_vm::update_code_heap_words()
{
- iterate_code_heap(factor::update_word_references);
+ iterate_code_heap(&factor_vm::update_word_references);
}
void factor_vm::primitive_modify_code_heap()
namespace factor
{
-struct factor_vm;
-typedef void (*code_heap_iterator)(code_block *compiled, factor_vm *myvm);
-
}
code_heap_scans++;
if(collecting_gen == data->tenured())
- code->free_unmarked((heap_iterator)factor::update_literal_and_word_references);
+ code->free_unmarked((heap_iterator)&factor_vm::update_literal_and_word_references);
else
copy_code_heap_roots();
add_to_free_list((free_heap_block *)prev);
scan->status = B_ALLOCATED;
prev = scan;
- iter(scan,myvm);
+ (myvm->*iter)(scan);
break;
default:
myvm->critical_error("Invalid scan->status",(cell)scan);
free_heap_block *large_blocks;
};
-typedef void (*heap_iterator)(heap_block *compiled, factor_vm *vm);
+typedef void (factor_vm::*heap_iterator)(heap_block *compiled);
struct heap {
factor_vm *myvm;
void factor_vm::relocate_code()
{
- iterate_code_heap(factor::fixup_code_block);
+ iterate_code_heap(&factor_vm::fixup_code_block);
}
/* Read an image file from disk, only done once during startup */
}
/* Update XTs in code heap */
- iterate_code_heap(factor::relocate_code_block);
+ iterate_code_heap(&factor_vm::relocate_code_block);
}
void factor_vm::primitive_profiling()
}
- iterate_code_heap(factor::relocate_code_block);
+ iterate_code_heap(&factor_vm::relocate_code_block);
}
/* Allocates memory */
void primitive_fclose();
//code_block
+ typedef void (factor_vm::*relocation_iterator)(relocation_entry rel, cell index, code_block *compiled);
+
relocation_type relocation_type_of(relocation_entry r);
relocation_class relocation_class_of(relocation_entry r);
cell relocation_offset_of(relocation_entry r);
//code_heap
heap *code;
unordered_map<heap_block *, char *> forwarding;
+ typedef void (factor_vm::*code_heap_iterator)(code_block *compiled);
void init_code_heap(cell size);
bool in_code_heap_p(cell ptr);