copying_collector<aging_space, aging_policy> collector(this,
this->data->aging,
aging_policy(this));
- collector.trace_roots();
- collector.trace_contexts();
+ collector.data_visitor.visit_roots();
+ collector.data_visitor.visit_contexts();
collector.cheneys_algorithm();
decks_scanned(0),
code_blocks_scanned(0) {}
- void trace_handle(cell* handle) { data_visitor.visit_handle(handle); }
-
void trace_object(object* ptr) {
data_visitor.visit_slots(ptr);
if (ptr->type() == ALIEN_TYPE)
((alien*)ptr)->update_address();
}
- void trace_roots() { data_visitor.visit_roots(); }
-
- void trace_contexts() { data_visitor.visit_contexts(); }
-
- void trace_code_block_objects(code_block* compiled) {
- data_visitor.visit_code_block_objects(compiled);
- }
-
- void trace_embedded_literals(code_block* compiled) {
- data_visitor.visit_embedded_literals(compiled);
- }
-
void trace_code_heap_roots(std::set<code_block*>* remembered_set) {
std::set<code_block*>::const_iterator iter = remembered_set->begin();
std::set<code_block*>::const_iterator end = remembered_set->end();
for (; iter != end; iter++) {
code_block* compiled = *iter;
- trace_code_block_objects(compiled);
- trace_embedded_literals(compiled);
+ data_visitor.visit_code_block_objects(compiled);
+ data_visitor.visit_embedded_literals(compiled);
compiled->flush_icache();
code_blocks_scanned++;
}
code_visitor.visit_embedded_code_pointers(compiled);
}
-void full_collector::trace_context_code_blocks() {
- code_visitor.visit_context_code_blocks();
-}
-
-void full_collector::trace_code_roots() { code_visitor.visit_code_roots(); }
-
-void full_collector::trace_object_code_block(object* obj) {
- code_visitor.visit_object_code_block(obj);
-}
-
/* After a sweep, invalidate any code heap roots which are not marked,
so that if a block makes a tail call to a generic word, and the PIC
compiler triggers a GC, and the caller block gets gets GCd as a result,
code->clear_mark_bits();
data->tenured->clear_mark_bits();
- collector.trace_roots();
+ collector.data_visitor.visit_roots();
if (trace_contexts_p) {
- collector.trace_contexts();
- collector.trace_context_code_blocks();
- collector.trace_code_roots();
+ collector.data_visitor.visit_contexts();
+ collector.code_visitor.visit_context_code_blocks();
+ collector.code_visitor.visit_code_roots();
}
while (!mark_stack.empty()) {
} else {
object* obj = (object*)ptr;
collector.trace_object(obj);
- collector.trace_object_code_block(obj);
+ collector.code_visitor.visit_object_code_block(obj);
}
}
explicit full_collector(factor_vm* parent);
void trace_code_block(code_block* compiled);
- void trace_context_code_blocks();
- void trace_code_roots();
- void trace_object_code_block(object* obj);
};
}
this->data->aging,
nursery_policy(this));
- collector.trace_roots();
- collector.trace_contexts();
+ collector.data_visitor.visit_roots();
+ collector.data_visitor.visit_contexts();
gc_event* event = current_gc->event;
mark_stack.clear();
- collector.trace_roots();
- collector.trace_contexts();
+ collector.data_visitor.visit_roots();
+ collector.data_visitor.visit_contexts();
gc_event* event = current_gc->event;