hotspot/src/share/vm/classfile/javaClasses.cpp
changeset 14588 8ec26d2d9339
parent 14583 d70ee55535f4
child 14742 b2a47eb99404
child 15097 9db149412e0e
equal deleted inserted replaced
14584:bd4290e6d0a5 14588:8ec26d2d9339
  2542   return (Metadata*)mname->address_field(_vmtarget_offset);
  2542   return (Metadata*)mname->address_field(_vmtarget_offset);
  2543 }
  2543 }
  2544 
  2544 
  2545 void java_lang_invoke_MemberName::set_vmtarget(oop mname, Metadata* ref) {
  2545 void java_lang_invoke_MemberName::set_vmtarget(oop mname, Metadata* ref) {
  2546   assert(is_instance(mname), "wrong type");
  2546   assert(is_instance(mname), "wrong type");
  2547 #ifdef ASSERT
       
  2548   // check the type of the vmtarget
  2547   // check the type of the vmtarget
       
  2548   oop dependency = NULL;
  2549   if (ref != NULL) {
  2549   if (ref != NULL) {
  2550     switch (flags(mname) & (MN_IS_METHOD |
  2550     switch (flags(mname) & (MN_IS_METHOD |
  2551                             MN_IS_CONSTRUCTOR |
  2551                             MN_IS_CONSTRUCTOR |
  2552                             MN_IS_FIELD)) {
  2552                             MN_IS_FIELD)) {
  2553     case MN_IS_METHOD:
  2553     case MN_IS_METHOD:
  2554     case MN_IS_CONSTRUCTOR:
  2554     case MN_IS_CONSTRUCTOR:
  2555       assert(ref->is_method(), "should be a method");
  2555       assert(ref->is_method(), "should be a method");
       
  2556       dependency = ((Method*)ref)->method_holder()->java_mirror();
  2556       break;
  2557       break;
  2557     case MN_IS_FIELD:
  2558     case MN_IS_FIELD:
  2558       assert(ref->is_klass(), "should be a class");
  2559       assert(ref->is_klass(), "should be a class");
       
  2560       dependency = ((Klass*)ref)->java_mirror();
  2559       break;
  2561       break;
  2560     default:
  2562     default:
  2561       ShouldNotReachHere();
  2563       ShouldNotReachHere();
  2562     }
  2564     }
  2563   }
  2565   }
  2564 #endif //ASSERT
       
  2565   mname->address_field_put(_vmtarget_offset, (address)ref);
  2566   mname->address_field_put(_vmtarget_offset, (address)ref);
  2566   oop loader = NULL;
  2567   // Add a reference to the loader (actually mirror because anonymous classes will not have
  2567   if (ref != NULL) {
  2568   // distinct loaders) to ensure the metadata is kept alive
  2568     if (ref->is_klass()) {
  2569   // This mirror may be different than the one in clazz field.
  2569       loader = ((Klass*)ref)->class_loader();
  2570   mname->obj_field_put(_vmloader_offset, dependency);
  2570     } else if (ref->is_method()) {
       
  2571       loader = ((Method*)ref)->method_holder()->class_loader();
       
  2572     } else {
       
  2573       ShouldNotReachHere();
       
  2574     }
       
  2575   }
       
  2576   // Add a reference to the loader to ensure the metadata is kept alive
       
  2577   mname->obj_field_put(_vmloader_offset, loader);
       
  2578 }
  2571 }
  2579 
  2572 
  2580 intptr_t java_lang_invoke_MemberName::vmindex(oop mname) {
  2573 intptr_t java_lang_invoke_MemberName::vmindex(oop mname) {
  2581   assert(is_instance(mname), "wrong type");
  2574   assert(is_instance(mname), "wrong type");
  2582   return (intptr_t) mname->address_field(_vmindex_offset);
  2575   return (intptr_t) mname->address_field(_vmindex_offset);
  2737 
  2730 
  2738 // Support for java_lang_ClassLoader
  2731 // Support for java_lang_ClassLoader
  2739 
  2732 
  2740 bool java_lang_ClassLoader::offsets_computed = false;
  2733 bool java_lang_ClassLoader::offsets_computed = false;
  2741 int  java_lang_ClassLoader::_loader_data_offset = -1;
  2734 int  java_lang_ClassLoader::_loader_data_offset = -1;
  2742 int  java_lang_ClassLoader::_dependencies_offset = -1;
       
  2743 int  java_lang_ClassLoader::parallelCapable_offset = -1;
  2735 int  java_lang_ClassLoader::parallelCapable_offset = -1;
  2744 
  2736 
  2745 ClassLoaderData** java_lang_ClassLoader::loader_data_addr(oop loader) {
  2737 ClassLoaderData** java_lang_ClassLoader::loader_data_addr(oop loader) {
  2746     assert(loader != NULL && loader->is_oop(), "loader must be oop");
  2738     assert(loader != NULL && loader->is_oop(), "loader must be oop");
  2747     return (ClassLoaderData**) loader->address_field_addr(_loader_data_offset);
  2739     return (ClassLoaderData**) loader->address_field_addr(_loader_data_offset);
  2748 }
  2740 }
  2749 
  2741 
  2750 ClassLoaderData* java_lang_ClassLoader::loader_data(oop loader) {
  2742 ClassLoaderData* java_lang_ClassLoader::loader_data(oop loader) {
  2751   return *java_lang_ClassLoader::loader_data_addr(loader);
  2743   return *java_lang_ClassLoader::loader_data_addr(loader);
  2752 }
       
  2753 
       
  2754 oop java_lang_ClassLoader::dependencies(oop loader) {
       
  2755   return loader->obj_field(_dependencies_offset);
       
  2756 }
       
  2757 
       
  2758 HeapWord* java_lang_ClassLoader::dependencies_addr(oop loader) {
       
  2759   if (UseCompressedOops) {
       
  2760     return (HeapWord*)loader->obj_field_addr<narrowOop>(_dependencies_offset);
       
  2761   } else {
       
  2762     return (HeapWord*)loader->obj_field_addr<oop>(_dependencies_offset);
       
  2763   }
       
  2764 }
  2744 }
  2765 
  2745 
  2766 void java_lang_ClassLoader::compute_offsets() {
  2746 void java_lang_ClassLoader::compute_offsets() {
  2767   assert(!offsets_computed, "offsets should be initialized only once");
  2747   assert(!offsets_computed, "offsets should be initialized only once");
  2768   offsets_computed = true;
  2748   offsets_computed = true;