39 #include "oops/instanceMirrorKlass.hpp" |
39 #include "oops/instanceMirrorKlass.hpp" |
40 #include "oops/klass.hpp" |
40 #include "oops/klass.hpp" |
41 #include "oops/method.hpp" |
41 #include "oops/method.hpp" |
42 #include "oops/symbol.hpp" |
42 #include "oops/symbol.hpp" |
43 #include "oops/typeArrayOop.hpp" |
43 #include "oops/typeArrayOop.hpp" |
|
44 #include "prims/jvmtiRedefineClassesTrace.hpp" |
44 #include "runtime/fieldDescriptor.hpp" |
45 #include "runtime/fieldDescriptor.hpp" |
45 #include "runtime/handles.inline.hpp" |
46 #include "runtime/handles.inline.hpp" |
46 #include "runtime/interfaceSupport.hpp" |
47 #include "runtime/interfaceSupport.hpp" |
47 #include "runtime/java.hpp" |
48 #include "runtime/java.hpp" |
48 #include "runtime/javaCalls.hpp" |
49 #include "runtime/javaCalls.hpp" |
2792 Metadata* java_lang_invoke_MemberName::vmtarget(oop mname) { |
2793 Metadata* java_lang_invoke_MemberName::vmtarget(oop mname) { |
2793 assert(is_instance(mname), "wrong type"); |
2794 assert(is_instance(mname), "wrong type"); |
2794 return (Metadata*)mname->address_field(_vmtarget_offset); |
2795 return (Metadata*)mname->address_field(_vmtarget_offset); |
2795 } |
2796 } |
2796 |
2797 |
|
2798 bool java_lang_invoke_MemberName::is_method(oop mname) { |
|
2799 assert(is_instance(mname), "must be MemberName"); |
|
2800 return (flags(mname) & (MN_IS_METHOD | MN_IS_CONSTRUCTOR)) > 0; |
|
2801 } |
|
2802 |
2797 #if INCLUDE_JVMTI |
2803 #if INCLUDE_JVMTI |
2798 // Can be executed on VM thread only |
2804 // Can be executed on VM thread only |
2799 void java_lang_invoke_MemberName::adjust_vmtarget(oop mname, Metadata* ref) { |
2805 void java_lang_invoke_MemberName::adjust_vmtarget(oop mname, Method* old_method, |
2800 assert((is_instance(mname) && (flags(mname) & (MN_IS_METHOD | MN_IS_CONSTRUCTOR)) > 0), "wrong type"); |
2806 Method* new_method, bool* trace_name_printed) { |
|
2807 assert(is_method(mname), "wrong type"); |
2801 assert(Thread::current()->is_VM_thread(), "not VM thread"); |
2808 assert(Thread::current()->is_VM_thread(), "not VM thread"); |
2802 mname->address_field_put(_vmtarget_offset, (address)ref); |
2809 |
|
2810 Method* target = (Method*)mname->address_field(_vmtarget_offset); |
|
2811 if (target == old_method) { |
|
2812 mname->address_field_put(_vmtarget_offset, (address)new_method); |
|
2813 |
|
2814 if (RC_TRACE_IN_RANGE(0x00100000, 0x00400000)) { |
|
2815 if (!(*trace_name_printed)) { |
|
2816 // RC_TRACE_MESG macro has an embedded ResourceMark |
|
2817 RC_TRACE_MESG(("adjust: name=%s", |
|
2818 old_method->method_holder()->external_name())); |
|
2819 *trace_name_printed = true; |
|
2820 } |
|
2821 // RC_TRACE macro has an embedded ResourceMark |
|
2822 RC_TRACE(0x00400000, ("MemberName method update: %s(%s)", |
|
2823 new_method->name()->as_C_string(), |
|
2824 new_method->signature()->as_C_string())); |
|
2825 } |
|
2826 } |
2803 } |
2827 } |
2804 #endif // INCLUDE_JVMTI |
2828 #endif // INCLUDE_JVMTI |
2805 |
2829 |
2806 void java_lang_invoke_MemberName::set_vmtarget(oop mname, Metadata* ref) { |
2830 void java_lang_invoke_MemberName::set_vmtarget(oop mname, Metadata* ref) { |
2807 assert(is_instance(mname), "wrong type"); |
2831 assert(is_instance(mname), "wrong type"); |