< 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 >