hotspot/src/share/vm/oops/method.cpp
changeset 46324 8764956ec928
parent 43607 015723e36620
child 46329 53ccc37bda19
--- a/hotspot/src/share/vm/oops/method.cpp	Fri Mar 10 12:58:37 2017 -0500
+++ b/hotspot/src/share/vm/oops/method.cpp	Fri Mar 03 23:08:35 2017 -0800
@@ -1101,12 +1101,11 @@
 }
 
 void Method::restore_unshareable_info(TRAPS) {
+  assert(is_method() && is_valid_method(), "ensure C++ vtable is restored");
+
   // Since restore_unshareable_info can be called more than once for a method, don't
   // redo any work.
   if (adapter() == NULL) {
-    // Restore Method's C++ vtable by calling a virtual function
-    restore_vtable();
-
     methodHandle mh(THREAD, this);
     link_method(mh, CHECK);
   }
@@ -2166,7 +2165,6 @@
 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
   return dereference_vptr(&m) == dereference_vptr(ptr);
 }
 
@@ -2177,10 +2175,12 @@
   } else if ((intptr_t(this) & (wordSize-1)) != 0) {
     // Quick sanity check on pointer.
     return false;
-  } else if (!is_metaspace_object()) {
+  } else if (MetaspaceShared::is_in_shared_space(this)) {
+    return MetaspaceShared::is_valid_shared_method(this);
+  } else if (Metaspace::contains_non_shared(this)) {
+    return has_method_vptr((const void*)this);
+  } else {
     return false;
-  } else {
-    return has_method_vptr((const void*)this);
   }
 }