object* fixup_data(object* obj) { if (aging->contains_p(obj) || tenured->contains_p(obj)) { return obj; } // Is there another forwarding pointer? while (obj->forwarding_pointer_p()) { object* dest = obj->forwarding_pointer(); obj = dest; } if (aging->contains_p(obj) || tenured->contains_p(obj)) { return obj; } cell size = obj->size(); object* newpointer = aging->allot(size); if (!newpointer) throw must_start_gc_again(); memcpy(newpointer, obj, size); obj->forward_to(newpointer); return newpointer; }
bool should_copy_p(object* untagged) { return !tenured->contains_p(untagged); }
void visited_object(object *obj) { if(!tenured->marked_p(obj)) promoted_object(obj); }
void promoted_object(object *obj) { tenured->set_marked_p(obj); parent->mark_stack.push_back((cell)obj); }