Object* Module::reset_method_cache(STATE, Symbol* name) { if(Class* self = try_as<Class>(this)) { self->increment_serial(); } if(!name->nil_p()) { if(MethodTableBucket* b = method_table_->find_entry(state, name)) { Executable* exec = b->method(); if(!exec->nil_p()) { exec->clear_inliners(state); } } } if(!hierarchy_subclasses_->nil_p()) { for(native_int i = 0; i < hierarchy_subclasses_->size(); ++i) { WeakRef* ref = try_as<WeakRef>(hierarchy_subclasses_->get(state, i)); if(ref && ref->alive_p()) { Module* mod = as<Module>(ref->object()); mod->reset_method_cache(state, name); } } } return cNil; }
void WeakRef::Info::mark(Object* obj, ObjectMark& mark) { WeakRef* ref = as<WeakRef>(obj); if(ref->alive_p()) { mark.gc->add_weak_ref(obj); } }