return obj;
}
- object* untagged = obj;
/* is there another forwarding pointer? */
- while (untagged->forwarding_pointer_p())
- untagged = untagged->forwarding_pointer();
+ while (obj->forwarding_pointer_p()) {
+ object* dest = obj->forwarding_pointer();
+ obj = dest;
+ }
- if (!policy.should_copy_p(untagged)) {
- policy.visited_object(untagged);
- return untagged;
+ if (!policy.should_copy_p(obj)) {
+ policy.visited_object(obj);
+ return obj;
}
- cell size = untagged->size();
+ 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);
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<code_block*>* remembered_set) {
std::set<code_block*>::const_iterator iter = remembered_set->begin();
std::set<code_block*>::const_iterator end = remembered_set->end();
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<cell>* mark_stack);
};
}
}
+template <typename Fixup>
+void slot_visitor<Fixup>::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. */
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);
}
}