VM: new function visit_mark_stack() to factor out the mark stack iteration

db4
Björn Lindqvist 2015-02-19 13:43:54 +00:00 committed by John Benediktsson
parent 667e5768ba
commit b5a206c587
4 changed files with 29 additions and 28 deletions

View File

@ -26,7 +26,7 @@ void factor_vm::collect_aging() {
if (event)
event->ended_code_scan(collector.code_blocks_scanned);
collector.tenure_reachable_objects();
collector.visitor.visit_mark_stack(&mark_stack);
}
{
/* If collection fails here, do a to_tenured collection. */

View File

@ -36,23 +36,8 @@ void factor_vm::collect_mark_impl() {
visitor.visit_context_code_blocks();
visitor.visit_uninitialized_code_blocks();
while (!mark_stack.empty()) {
cell ptr = mark_stack.back();
mark_stack.pop_back();
visitor.visit_mark_stack(&mark_stack);
if (ptr & 1) {
code_block* compiled = (code_block*)(ptr - 1);
visitor.visit_code_block_objects(compiled);
visitor.visit_embedded_literals(compiled);
visitor.visit_embedded_code_pointers(compiled);
} else {
object* obj = (object*)ptr;
visitor.visit_slots(obj);
if (obj->type() == ALIEN_TYPE)
((alien*)obj)->update_address();
visitor.visit_object_code_block(obj);
}
}
data->reset_tenured();
data->reset_aging();
data->reset_nursery();

View File

@ -144,6 +144,7 @@ template <typename Fixup> struct slot_visitor {
void visit_context_code_blocks();
void visit_uninitialized_code_blocks();
void visit_embedded_code_pointers(code_block* compiled);
void visit_mark_stack(std::vector<cell>* mark_stack);
};
template <typename Fixup>
@ -256,7 +257,6 @@ template <typename Fixup> void slot_visitor<Fixup>::visit_all_roots() {
visit_object_array(parent->special_objects,
parent->special_objects + special_object_count);
visit_contexts();
}
@ -536,4 +536,29 @@ void slot_visitor<Fixup>::visit_embedded_code_pointers(code_block* compiled) {
}
}
/* Pops items from the mark stack and visits them until the stack is
empty. Used when doing a full collection and when collecting to
tenured space. */
template <typename Fixup>
void slot_visitor<Fixup>::visit_mark_stack(std::vector<cell>* mark_stack) {
while (!mark_stack->empty()) {
cell ptr = mark_stack->back();
// TJaba
mark_stack->pop_back();
if (ptr & 1) {
code_block* compiled = (code_block*)(ptr - 1);
visit_code_block_objects(compiled);
visit_embedded_literals(compiled);
visit_embedded_code_pointers(compiled);
} else {
object* obj = (object*)ptr;
visit_slots(obj);
if (obj->type() == ALIEN_TYPE)
((alien*)obj)->update_address();
visit_object_code_block(obj);
}
}
}
}

View File

@ -7,15 +7,6 @@ to_tenured_collector::to_tenured_collector(factor_vm* parent)
parent->data->tenured,
to_tenured_policy(parent)) {}
void to_tenured_collector::tenure_reachable_objects() {
std::vector<cell>* mark_stack = &parent->mark_stack;
while (!mark_stack->empty()) {
cell ptr = mark_stack->back();
mark_stack->pop_back();
this->trace_object((object*)ptr);
}
}
void factor_vm::collect_to_tenured() {
/* Copy live objects from aging space to tenured space. */
to_tenured_collector collector(this);
@ -37,7 +28,7 @@ void factor_vm::collect_to_tenured() {
if (event)
event->ended_code_scan(collector.code_blocks_scanned);
collector.tenure_reachable_objects();
collector.visitor.visit_mark_stack(&mark_stack);
data->reset_nursery();
data->reset_aging();