src/share/vm/classfile/javaClasses.cpp

Print this page

        

@@ -2623,12 +2623,22 @@
 Metadata* java_lang_invoke_MemberName::vmtarget(oop mname) {
   assert(is_instance(mname), "wrong type");
   return (Metadata*)mname->address_field(_vmtarget_offset);
 }
 
+#if INCLUDE_JVMTI
+// Can be executed on VM thread only
+void java_lang_invoke_MemberName::adjust_vmtarget(oop mname, Metadata* ref) {
+  assert((is_instance(mname) && flags(mname) & (MN_IS_METHOD | MN_IS_CONSTRUCTOR)) > 0, "wrong type");
+  assert(Thread::current()->is_VM_thread(), "not VM thread");
+  mname->address_field_put(_vmtarget_offset, (address)ref);
+}
+#endif // INCLUDE_JVMTI
+
 void java_lang_invoke_MemberName::set_vmtarget(oop mname, Metadata* ref) {
   assert(is_instance(mname), "wrong type");
+
   // check the type of the vmtarget
   oop dependency = NULL;
   if (ref != NULL) {
     switch (flags(mname) & (MN_IS_METHOD |
                             MN_IS_CONSTRUCTOR |

@@ -2635,10 +2645,11 @@
                             MN_IS_FIELD)) {
     case MN_IS_METHOD:
     case MN_IS_CONSTRUCTOR:
       assert(ref->is_method(), "should be a method");
       dependency = ((Method*)ref)->method_holder()->java_mirror();
+      ((Method*)ref)->method_holder()->add_member_name(mname);
       break;
     case MN_IS_FIELD:
       assert(ref->is_klass(), "should be a class");
       dependency = ((Klass*)ref)->java_mirror();
       break;