# HG changeset patch # User coleenp # Date 1454628302 18000 # Node ID ee146fa2923b2220b169789c46ba4781c322f120 # Parent a2bae85710af24b1a88c2b3370931eb30a26a939 8149038: SIGSEGV at frame::is_interpreted_frame_valid -> StubRoutines::SafeFetchN Summary: Backout change for 8146984 but add an alignment check which may have caught original bug. Reviewed-by: mgronlun, dcubed diff -r a2bae85710af -r ee146fa2923b hotspot/src/share/vm/oops/method.cpp --- a/hotspot/src/share/vm/oops/method.cpp Thu Feb 04 19:27:39 2016 +0100 +++ b/hotspot/src/share/vm/oops/method.cpp Thu Feb 04 18:25:02 2016 -0500 @@ -55,7 +55,6 @@ #include "runtime/relocator.hpp" #include "runtime/sharedRuntime.hpp" #include "runtime/signature.hpp" -#include "runtime/stubRoutines.hpp" #include "utilities/quickSort.hpp" #include "utilities/xmlstream.hpp" @@ -2099,29 +2098,24 @@ } bool Method::has_method_vptr(const void* ptr) { - // Use SafeFetch to check if this is a valid pointer first + 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_vtable - intptr_t this_vptr = SafeFetchN((intptr_t*)ptr, intptr_t(1)); - if (this_vptr == 1) { - return false; - } - Method m; - return (intptr_t)dereference_vptr(&m) == this_vptr; + // This assumption is also in universe.cpp patch_klass_vtble + return dereference_vptr(&m) == dereference_vptr(ptr); } // 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 ((intptr_t(this) & (wordSize-1)) != 0) { + // Quick sanity check on pointer. + return false; + } else if (!is_metaspace_object()) { + return false; + } else { + return has_method_vptr((const void*)this); } - - // Quick sanity check on pointer. - if ((intptr_t(this) & (wordSize-1)) != 0) { - return false; - } - - return has_method_vptr(this); } #ifndef PRODUCT