diff --git a/vm/aging_collector.cpp b/vm/aging_collector.cpp index a12a3f7fae..8c6e4ae837 100644 --- a/vm/aging_collector.cpp +++ b/vm/aging_collector.cpp @@ -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. */ diff --git a/vm/full_collector.cpp b/vm/full_collector.cpp index bed79ac024..e4d0ca3cb5 100644 --- a/vm/full_collector.cpp +++ b/vm/full_collector.cpp @@ -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(); diff --git a/vm/slot_visitor.hpp b/vm/slot_visitor.hpp index 3ec5031370..9dfee053a3 100644 --- a/vm/slot_visitor.hpp +++ b/vm/slot_visitor.hpp @@ -144,6 +144,7 @@ template 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* mark_stack); }; template @@ -256,7 +257,6 @@ template void slot_visitor::visit_all_roots() { visit_object_array(parent->special_objects, parent->special_objects + special_object_count); - visit_contexts(); } @@ -536,4 +536,29 @@ void slot_visitor::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 +void slot_visitor::visit_mark_stack(std::vector* 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); + } + } +} + } diff --git a/vm/to_tenured_collector.cpp b/vm/to_tenured_collector.cpp index be349c265a..4288329281 100644 --- a/vm/to_tenured_collector.cpp +++ b/vm/to_tenured_collector.cpp @@ -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* 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();