void ImmixGC::walk_finalizers() { FinalizerHandler* fh = object_memory_->finalizer_handler(); if(!fh) return; for(FinalizerHandler::iterator i = fh->begin(); !i.end(); /* advance is handled in the loop */) { FinalizeObject& fi = i.current(); bool live = fi.object->marked_p(object_memory_->mark()); if(fi.ruby_finalizer) { if(Object* fwd = saw_object(fi.ruby_finalizer)) { fi.ruby_finalizer = fwd; } } if(Object* fwd = saw_object(fi.object)) { fi.object = fwd; } i.next(live); } }
void BakerGC::walk_finalizers() { FinalizerHandler* fh = object_memory_->finalizer_handler(); if(!fh) return; for(FinalizerHandler::iterator i = fh->begin(); !i.end(); /* advance is handled in the loop */) { FinalizeObject& fi = i.current(); bool live = true; if(fi.object->young_object_p()) { live = fi.object->forwarded_p(); if(Object* fwd = saw_object(fi.object)) { fi.object = fwd; } } else { // If this object is mature, scan it. This // means that any young objects it refers to are properly // GC'ed and kept alive if necessary scan_object(fi.object); } Object* fin = fi.ruby_finalizer; if(fin && fin->reference_p()) { if(fin->young_object_p()) { if(Object* fwd = saw_object(fin)) { fi.ruby_finalizer = fwd; } } else { // If this object is mature, scan it. This // means that any young objects it refers to are properly // GC'ed and kept alive if necessary scan_object(fin); } } i.next(live); } }
void BakerGC::walk_finalizers() { FinalizerHandler* fh = object_memory_->finalizer_handler(); if(!fh) return; for(FinalizerHandler::iterator i = fh->begin(); !i.end(); /* advance is handled in the loop */) { FinalizeObject& fi = i.current(); bool live = true; if(fi.object->young_object_p()) { live = fi.object->forwarded_p(); fi.object = saw_object(fi.object); } if(fi.ruby_finalizer && fi.ruby_finalizer->young_object_p()) { fi.ruby_finalizer = saw_object(fi.ruby_finalizer); } i.next(live); } }