diff --git a/vm/collector.hpp b/vm/collector.hpp index 626ae2b6b5..ce8b6445b8 100644 --- a/vm/collector.hpp +++ b/vm/collector.hpp @@ -25,23 +25,24 @@ struct gc_workhorse : no_fixup { return obj; } - object* untagged = obj; /* is there another forwarding pointer? */ - while (untagged->forwarding_pointer_p()) - untagged = untagged->forwarding_pointer(); - - if (!policy.should_copy_p(untagged)) { - policy.visited_object(untagged); - return untagged; + while (obj->forwarding_pointer_p()) { + object* dest = obj->forwarding_pointer(); + obj = dest; } - cell size = untagged->size(); + if (!policy.should_copy_p(obj)) { + policy.visited_object(obj); + return obj; + } + + cell size = obj->size(); object* newpointer = target->allot(size); if (!newpointer) throw must_start_gc_again(); - memcpy(newpointer, untagged, size); - untagged->forward_to(newpointer); + memcpy(newpointer, obj, size); + obj->forward_to(newpointer); policy.promoted_object(newpointer); @@ -80,12 +81,6 @@ template struct collector { decks_scanned(0), code_blocks_scanned(0) {} - void trace_object(object* ptr) { - visitor.visit_slots(ptr); - if (ptr->type() == ALIEN_TYPE) - ((alien*)ptr)->update_address(); - } - void trace_code_heap_roots(std::set* remembered_set) { std::set::const_iterator iter = remembered_set->begin(); std::set::const_iterator end = remembered_set->end(); diff --git a/vm/copying_collector.hpp b/vm/copying_collector.hpp index 4493ecbb5b..911363f97f 100644 --- a/vm/copying_collector.hpp +++ b/vm/copying_collector.hpp @@ -11,7 +11,7 @@ struct copying_collector : collector { void cheneys_algorithm() { while (scan && scan < this->target->here) { - this->trace_object((object*)scan); + this->visitor.visit_object((object*)scan); scan = this->target->next_object_after(scan); } } diff --git a/vm/slot_visitor.hpp b/vm/slot_visitor.hpp index 9dfee053a3..09a4b5fd22 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_object(object* obj); void visit_mark_stack(std::vector* mark_stack); }; @@ -536,6 +537,13 @@ void slot_visitor::visit_embedded_code_pointers(code_block* compiled) { } } +template +void slot_visitor::visit_object(object *ptr) { + visit_slots(ptr); + if (ptr->type() == ALIEN_TYPE) + ((alien*)ptr)->update_address(); +} + /* 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. */ @@ -553,9 +561,7 @@ void slot_visitor::visit_mark_stack(std::vector* mark_stack) { visit_embedded_code_pointers(compiled); } else { object* obj = (object*)ptr; - visit_slots(obj); - if (obj->type() == ALIEN_TYPE) - ((alien*)obj)->update_address(); + visit_object(obj); visit_object_code_block(obj); } }