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)
|
if (event)
|
||||||
event->ended_code_scan(collector.code_blocks_scanned);
|
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. */
|
/* 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_context_code_blocks();
|
||||||
visitor.visit_uninitialized_code_blocks();
|
visitor.visit_uninitialized_code_blocks();
|
||||||
|
|
||||||
while (!mark_stack.empty()) {
|
visitor.visit_mark_stack(&mark_stack);
|
||||||
cell ptr = mark_stack.back();
|
|
||||||
mark_stack.pop_back();
|
|
||||||
|
|
||||||
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_tenured();
|
||||||
data->reset_aging();
|
data->reset_aging();
|
||||||
data->reset_nursery();
|
data->reset_nursery();
|
||||||
|
|
|
@ -144,6 +144,7 @@ template <typename Fixup> struct slot_visitor {
|
||||||
void visit_context_code_blocks();
|
void visit_context_code_blocks();
|
||||||
void visit_uninitialized_code_blocks();
|
void visit_uninitialized_code_blocks();
|
||||||
void visit_embedded_code_pointers(code_block* compiled);
|
void visit_embedded_code_pointers(code_block* compiled);
|
||||||
|
void visit_mark_stack(std::vector<cell>* mark_stack);
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename Fixup>
|
template <typename Fixup>
|
||||||
|
@ -256,7 +257,6 @@ template <typename Fixup> void slot_visitor<Fixup>::visit_all_roots() {
|
||||||
visit_object_array(parent->special_objects,
|
visit_object_array(parent->special_objects,
|
||||||
parent->special_objects + special_object_count);
|
parent->special_objects + special_object_count);
|
||||||
|
|
||||||
|
|
||||||
visit_contexts();
|
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,
|
parent->data->tenured,
|
||||||
to_tenured_policy(parent)) {}
|
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() {
|
void factor_vm::collect_to_tenured() {
|
||||||
/* Copy live objects from aging space to tenured space. */
|
/* Copy live objects from aging space to tenured space. */
|
||||||
to_tenured_collector collector(this);
|
to_tenured_collector collector(this);
|
||||||
|
@ -37,7 +28,7 @@ void factor_vm::collect_to_tenured() {
|
||||||
if (event)
|
if (event)
|
||||||
event->ended_code_scan(collector.code_blocks_scanned);
|
event->ended_code_scan(collector.code_blocks_scanned);
|
||||||
|
|
||||||
collector.tenure_reachable_objects();
|
collector.visitor.visit_mark_stack(&mark_stack);
|
||||||
|
|
||||||
data->reset_nursery();
|
data->reset_nursery();
|
||||||
data->reset_aging();
|
data->reset_aging();
|
||||||
|
|
Loading…
Reference in New Issue