24
25 #include "precompiled.hpp"
26 #include "classfile/altHashing.hpp"
27 #include "classfile/javaClasses.hpp"
28 #include "classfile/symbolTable.hpp"
29 #include "classfile/vmSymbols.hpp"
30 #include "code/debugInfo.hpp"
31 #include "code/pcDesc.hpp"
32 #include "compiler/compilerOracle.hpp"
33 #include "interpreter/interpreter.hpp"
34 #include "memory/oopFactory.hpp"
35 #include "memory/resourceArea.hpp"
36 #include "memory/universe.inline.hpp"
37 #include "oops/fieldStreams.hpp"
38 #include "oops/instanceKlass.hpp"
39 #include "oops/instanceMirrorKlass.hpp"
40 #include "oops/klass.hpp"
41 #include "oops/method.hpp"
42 #include "oops/symbol.hpp"
43 #include "oops/typeArrayOop.hpp"
44 #include "runtime/fieldDescriptor.hpp"
45 #include "runtime/handles.inline.hpp"
46 #include "runtime/interfaceSupport.hpp"
47 #include "runtime/java.hpp"
48 #include "runtime/javaCalls.hpp"
49 #include "runtime/safepoint.hpp"
50 #include "runtime/thread.inline.hpp"
51 #include "runtime/vframe.hpp"
52 #include "utilities/preserveException.hpp"
53
54 PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC
55
56 #define INJECTED_FIELD_COMPUTE_OFFSET(klass, name, signature, may_be_java) \
57 klass::_##name##_offset = JavaClasses::compute_injected_offset(JavaClasses::klass##_##name##_enum);
58
59 #define DECLARE_INJECTED_FIELD(klass, name, signature, may_be_java) \
60 { SystemDictionary::WK_KLASS_ENUM_NAME(klass), vmSymbols::VM_SYMBOL_ENUM_NAME(name##_name), vmSymbols::VM_SYMBOL_ENUM_NAME(signature), may_be_java },
61
62 InjectedField JavaClasses::_injected_fields[] = {
63 ALL_INJECTED_FIELDS(DECLARE_INJECTED_FIELD)
2758 void java_lang_invoke_MemberName::set_type(oop mname, oop type) {
2759 assert(is_instance(mname), "wrong type");
2760 mname->obj_field_put(_type_offset, type);
2761 }
2762
2763 int java_lang_invoke_MemberName::flags(oop mname) {
2764 assert(is_instance(mname), "wrong type");
2765 return mname->int_field(_flags_offset);
2766 }
2767
2768 void java_lang_invoke_MemberName::set_flags(oop mname, int flags) {
2769 assert(is_instance(mname), "wrong type");
2770 mname->int_field_put(_flags_offset, flags);
2771 }
2772
2773 Metadata* java_lang_invoke_MemberName::vmtarget(oop mname) {
2774 assert(is_instance(mname), "wrong type");
2775 return (Metadata*)mname->address_field(_vmtarget_offset);
2776 }
2777
2778 #if INCLUDE_JVMTI
2779 // Can be executed on VM thread only
2780 void java_lang_invoke_MemberName::adjust_vmtarget(oop mname, Metadata* ref) {
2781 assert((is_instance(mname) && (flags(mname) & (MN_IS_METHOD | MN_IS_CONSTRUCTOR)) > 0), "wrong type");
2782 assert(Thread::current()->is_VM_thread(), "not VM thread");
2783 mname->address_field_put(_vmtarget_offset, (address)ref);
2784 }
2785 #endif // INCLUDE_JVMTI
2786
2787 void java_lang_invoke_MemberName::set_vmtarget(oop mname, Metadata* ref) {
2788 assert(is_instance(mname), "wrong type");
2789 // check the type of the vmtarget
2790 oop dependency = NULL;
2791 if (ref != NULL) {
2792 switch (flags(mname) & (MN_IS_METHOD |
2793 MN_IS_CONSTRUCTOR |
2794 MN_IS_FIELD)) {
2795 case MN_IS_METHOD:
2796 case MN_IS_CONSTRUCTOR:
2797 assert(ref->is_method(), "should be a method");
2798 dependency = ((Method*)ref)->method_holder()->java_mirror();
2799 break;
2800 case MN_IS_FIELD:
2801 assert(ref->is_klass(), "should be a class");
2802 dependency = ((Klass*)ref)->java_mirror();
2803 break;
|
24
25 #include "precompiled.hpp"
26 #include "classfile/altHashing.hpp"
27 #include "classfile/javaClasses.hpp"
28 #include "classfile/symbolTable.hpp"
29 #include "classfile/vmSymbols.hpp"
30 #include "code/debugInfo.hpp"
31 #include "code/pcDesc.hpp"
32 #include "compiler/compilerOracle.hpp"
33 #include "interpreter/interpreter.hpp"
34 #include "memory/oopFactory.hpp"
35 #include "memory/resourceArea.hpp"
36 #include "memory/universe.inline.hpp"
37 #include "oops/fieldStreams.hpp"
38 #include "oops/instanceKlass.hpp"
39 #include "oops/instanceMirrorKlass.hpp"
40 #include "oops/klass.hpp"
41 #include "oops/method.hpp"
42 #include "oops/symbol.hpp"
43 #include "oops/typeArrayOop.hpp"
44 #include "prims/jvmtiRedefineClassesTrace.hpp"
45 #include "runtime/fieldDescriptor.hpp"
46 #include "runtime/handles.inline.hpp"
47 #include "runtime/interfaceSupport.hpp"
48 #include "runtime/java.hpp"
49 #include "runtime/javaCalls.hpp"
50 #include "runtime/safepoint.hpp"
51 #include "runtime/thread.inline.hpp"
52 #include "runtime/vframe.hpp"
53 #include "utilities/preserveException.hpp"
54
55 PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC
56
57 #define INJECTED_FIELD_COMPUTE_OFFSET(klass, name, signature, may_be_java) \
58 klass::_##name##_offset = JavaClasses::compute_injected_offset(JavaClasses::klass##_##name##_enum);
59
60 #define DECLARE_INJECTED_FIELD(klass, name, signature, may_be_java) \
61 { SystemDictionary::WK_KLASS_ENUM_NAME(klass), vmSymbols::VM_SYMBOL_ENUM_NAME(name##_name), vmSymbols::VM_SYMBOL_ENUM_NAME(signature), may_be_java },
62
63 InjectedField JavaClasses::_injected_fields[] = {
64 ALL_INJECTED_FIELDS(DECLARE_INJECTED_FIELD)
2759 void java_lang_invoke_MemberName::set_type(oop mname, oop type) {
2760 assert(is_instance(mname), "wrong type");
2761 mname->obj_field_put(_type_offset, type);
2762 }
2763
2764 int java_lang_invoke_MemberName::flags(oop mname) {
2765 assert(is_instance(mname), "wrong type");
2766 return mname->int_field(_flags_offset);
2767 }
2768
2769 void java_lang_invoke_MemberName::set_flags(oop mname, int flags) {
2770 assert(is_instance(mname), "wrong type");
2771 mname->int_field_put(_flags_offset, flags);
2772 }
2773
2774 Metadata* java_lang_invoke_MemberName::vmtarget(oop mname) {
2775 assert(is_instance(mname), "wrong type");
2776 return (Metadata*)mname->address_field(_vmtarget_offset);
2777 }
2778
2779 bool java_lang_invoke_MemberName::is_method(oop mname) {
2780 assert(is_instance(mname), "must be MemberName");
2781 return (flags(mname) & (MN_IS_METHOD | MN_IS_CONSTRUCTOR)) > 0;
2782 }
2783
2784 #if INCLUDE_JVMTI
2785 // Can be executed on VM thread only
2786 void java_lang_invoke_MemberName::adjust_vmtarget(oop mname, Method* old_method,
2787 Method* new_method, bool* trace_name_printed) {
2788 assert(is_method(mname), "wrong type");
2789 assert(Thread::current()->is_VM_thread(), "not VM thread");
2790
2791 Method* target = (Method*)mname->address_field(_vmtarget_offset);
2792 if (target == old_method) {
2793 mname->address_field_put(_vmtarget_offset, (address)new_method);
2794
2795 if (RC_TRACE_IN_RANGE(0x00100000, 0x00400000)) {
2796 if (!(*trace_name_printed)) {
2797 // RC_TRACE_MESG macro has an embedded ResourceMark
2798 RC_TRACE_MESG(("adjust: name=%s",
2799 old_method->method_holder()->external_name()));
2800 *trace_name_printed = true;
2801 }
2802 // RC_TRACE macro has an embedded ResourceMark
2803 RC_TRACE(0x00400000, ("MemberName method update: %s(%s)",
2804 new_method->name()->as_C_string(),
2805 new_method->signature()->as_C_string()));
2806 }
2807 }
2808 }
2809 #endif // INCLUDE_JVMTI
2810
2811 void java_lang_invoke_MemberName::set_vmtarget(oop mname, Metadata* ref) {
2812 assert(is_instance(mname), "wrong type");
2813 // check the type of the vmtarget
2814 oop dependency = NULL;
2815 if (ref != NULL) {
2816 switch (flags(mname) & (MN_IS_METHOD |
2817 MN_IS_CONSTRUCTOR |
2818 MN_IS_FIELD)) {
2819 case MN_IS_METHOD:
2820 case MN_IS_CONSTRUCTOR:
2821 assert(ref->is_method(), "should be a method");
2822 dependency = ((Method*)ref)->method_holder()->java_mirror();
2823 break;
2824 case MN_IS_FIELD:
2825 assert(ref->is_klass(), "should be a class");
2826 dependency = ((Klass*)ref)->java_mirror();
2827 break;
|