VM: new function visit_mark_stack() to factor out the mark stack iteration
parent
667e5768ba
commit
b5a206c587
|
@ -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. */
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue