void CompiledMethod::Info::visit(Object* obj, ObjectVisitor& visit) { auto_visit(obj, visit); visit_inliners(obj, visit); CompiledMethod* cm = as<CompiledMethod>(obj); if(!cm->backend_method_) return; VMMethod* vmm = cm->backend_method_; #ifdef ENABLE_LLVM if(cm->jit_data()) { cm->jit_data()->visit_all(visit); } for(int i = 0; i < VMMethod::cMaxSpecializations; i++) { if(vmm->specializations[i].jit_data) { vmm->specializations[i].jit_data->visit_all(visit); } } #endif for(size_t i = 0; i < vmm->inline_cache_count(); i++) { InlineCache* cache = &vmm->caches[i]; MethodCacheEntry* mce = cache->cache_; if(mce) visit.call(mce); for(int i = 0; i < cTrackedICHits; i++) { Module* mod = cache->seen_classes_[i].klass(); if(mod) visit.call(mod); } } }
void CompiledMethod::Info::mark(Object* obj, ObjectMark& mark) { auto_mark(obj, mark); mark_inliners(obj, mark); CompiledMethod* cm = as<CompiledMethod>(obj); if(!cm->backend_method_) return; VMMethod* vmm = cm->backend_method_; vmm->set_mark(); Object* tmp; #ifdef ENABLE_LLVM if(cm->jit_data()) { cm->jit_data()->set_mark(); cm->jit_data()->mark_all(cm, mark); } for(int i = 0; i < VMMethod::cMaxSpecializations; i++) { if(vmm->specializations[i].jit_data) { vmm->specializations[i].jit_data->set_mark(); vmm->specializations[i].jit_data->mark_all(cm, mark); } } #endif for(size_t i = 0; i < vmm->inline_cache_count(); i++) { InlineCache* cache = &vmm->caches[i]; MethodCacheEntry* mce = cache->cache_; if(mce) { tmp = mark.call(mce); if(tmp) { cache->cache_ = (MethodCacheEntry*)tmp; mark.just_set(obj, tmp); } } if(cache->call_unit_) { tmp = mark.call(cache->call_unit_); if(tmp) { cache->call_unit_ = (CallUnit*)tmp; mark.just_set(obj, tmp); } } for(int i = 0; i < cTrackedICHits; i++) { Module* mod = cache->seen_classes_[i].klass(); if(mod) { tmp = mark.call(mod); if(tmp) { cache->seen_classes_[i].set_klass(force_as<Class>(tmp)); mark.just_set(obj, tmp); } } } } }
void CompiledMethod::Info::mark(Object* obj, ObjectMark& mark) { auto_mark(obj, mark); mark_inliners(obj, mark); CompiledMethod* cm = as<CompiledMethod>(obj); if(!cm->backend_method_) return; VMMethod* vmm = cm->backend_method_; vmm->set_mark(); Object* tmp; #ifdef ENABLE_LLVM if(cm->jit_data()) { cm->jit_data()->set_mark(); cm->jit_data()->mark_all(cm, mark); } #endif for(size_t i = 0; i < vmm->inline_cache_count(); i++) { InlineCache* cache = &vmm->caches[i]; if(cache->module) { tmp = mark.call(cache->module); if(tmp) { cache->module = (Module*)tmp; mark.just_set(obj, tmp); } } if(cache->method) { tmp = mark.call(cache->method); if(tmp) { cache->method = (Executable*)tmp; mark.just_set(obj, tmp); } } if(cache->klass_) { tmp = mark.call(cache->klass_); if(tmp) { cache->klass_ = (Class*)tmp; mark.just_set(obj, tmp); } } if(cache->call_unit_) { tmp = mark.call(cache->call_unit_); if(tmp) { cache->call_unit_ = (CallUnit*)tmp; mark.just_set(obj, tmp); } } for(int i = 0; i < cTrackedICHits; i++) { Module* mod = cache->seen_classes_[i].klass(); if(mod) { tmp = mark.call(mod); if(tmp) { cache->seen_classes_[i].set_klass(force_as<Class>(tmp)); mark.just_set(obj, tmp); } } } } for(IndirectLiterals::iterator i = vmm->indirect_literals().begin(); i != vmm->indirect_literals().end(); ++i) { Object** ptr = (*i); if((tmp = mark.call(*ptr)) != NULL) { *ptr = tmp; mark.just_set(obj, tmp); } } }