8149038: SIGSEGV at frame::is_interpreted_frame_valid -> StubRoutines::SafeFetchN
authorcoleenp
Thu, 04 Feb 2016 18:25:02 -0500
changeset 35937 ee146fa2923b
parent 35935 a2bae85710af
child 35938 a734965f7634
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
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