< prev index next >
src/share/vm/oops/method.cpp
Print this page
*** 2094,2120 ****
void Method::clear_jmethod_ids(ClassLoaderData* loader_data) {
loader_data->jmethod_ids()->clear_all_methods();
}
bool Method::has_method_vptr(const void* ptr) {
! Method m;
// This assumes that the vtbl pointer is the first word of a C++ object.
! // This assumption is also in universe.cpp patch_klass_vtble
! void* vtbl2 = dereference_vptr((const void*)&m);
! void* this_vtbl = dereference_vptr(ptr);
! return vtbl2 == this_vtbl;
}
// Check that this pointer is valid by checking that the vtbl pointer matches
bool Method::is_valid_method() const {
if (this == NULL) {
return false;
! } else if (!is_metaspace_object()) {
return false;
} else {
! return has_method_vptr((const void*)this);
}
}
#ifndef PRODUCT
void Method::print_jmethod_ids(ClassLoaderData* loader_data, outputStream* out) {
out->print_cr("jni_method_id count = %d", loader_data->jmethod_ids()->count_methods());
--- 2094,2127 ----
void Method::clear_jmethod_ids(ClassLoaderData* loader_data) {
loader_data->jmethod_ids()->clear_all_methods();
}
bool Method::has_method_vptr(const void* ptr) {
! // Use SafeFetch to check if this is a valid pointer first
// This assumes that the vtbl pointer is the first word of a C++ object.
! // This assumption is also in universe.cpp patch_klass_vtable
! intptr_t this_vptr = SafeFetchN((intptr_t*)ptr, intptr_t(1));
! if (this_vptr == 1) {
! return false;
! }
! Method m;
! void* vptr2 = dereference_vptr((const void*)&m);
! return (intptr_t)vptr2 == this_vptr;
}
// Check that this pointer is valid by checking that the vtbl pointer matches
bool Method::is_valid_method() const {
if (this == NULL) {
return false;
! } else {
! // Quick sanity check on pointer.
! if ((intptr_t(this) & (wordSize-1)) != 0) {
return false;
} else {
! return has_method_vptr(this);
}
+ }
}
#ifndef PRODUCT
void Method::print_jmethod_ids(ClassLoaderData* loader_data, outputStream* out) {
out->print_cr("jni_method_id count = %d", loader_data->jmethod_ids()->count_methods());
< prev index next >