VtableStub* VtableStubs::lookup(bool is_vtable_stub, int vtable_index) { MutexLocker ml(VtableStubs_lock); unsigned hash = VtableStubs::hash(is_vtable_stub, vtable_index); VtableStub* s = _table[hash]; while( s && !s->matches(is_vtable_stub, vtable_index)) s = s->next(); return s; }
void VtableStubs::vtable_stub_do(void f(VtableStub*)) { for (int i = 0; i < N; i++) { for (VtableStub* s = _table[i]; s != NULL; s = s->next()) { f(s); } } }
bool VtableStubs::is_entry_point(address pc) { MutexLocker ml(VtableStubs_lock); VtableStub* stub = (VtableStub*)(pc - VtableStub::entry_offset()); uint hash = VtableStubs::hash(stub->is_vtable_stub(), stub->index()); VtableStub* s; for (s = _table[hash]; s != NULL && s != stub; s = s->next()) {} return s == stub; }
VtableStub* VtableStubs::stub_containing(address pc) { // Note: No locking needed since any change to the data structure // happens with an atomic store into it (we don't care about // consistency with the _number_of_vtable_stubs counter). for (int i = 0; i < N; i++) { for (VtableStub* s = _table[i]; s != NULL; s = s->next()) { if (s->contains(pc)) return s; } } return NULL; }