void Fiber::Info::mark(Object* obj, memory::ObjectMark& mark) { auto_mark(obj, mark); Fiber* fib = force_as<Fiber>(obj); FiberData* data = fib->data(); if(!data || data->dead_p()) return; data->set_mark(); }
void FiberStacks::gc_scan(GarbageCollector* gc) { for(Datas::iterator i = datas_.begin(); i != datas_.end(); ++i) { FiberData* data = *i; if(data->dead_p()) continue; AddressDisplacement dis(data->data_offset(), data->data_lower_bound(), data->data_upper_bound()); if(CallFrame* cf = data->call_frame()) { gc->walk_call_frame(cf, &dis); } gc->scan(data->variable_root_buffers(), false, &dis); } }