src/share/vm/classfile/javaClasses.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File 8042235_8u40 Sdiff src/share/vm/classfile

src/share/vm/classfile/javaClasses.cpp

Print this page
rev 6917 : 8042235: redefining method used by multiple MethodHandles crashes VM
Summary: note all MemberNames created on internal list for adjusting method entries.
Reviewed-by: sspitsyn, dcubed, lfoltan


  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;


src/share/vm/classfile/javaClasses.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File