src/hotspot/share/classfile/javaClasses.cpp
changeset 50634 c349d409262a
parent 50532 a18c60527166
child 50819 cf09f0b56efd
equal deleted inserted replaced
50633:b8055b38b252 50634:c349d409262a
  3991 
  3991 
  3992 bool java_lang_ClassLoader::offsets_computed = false;
  3992 bool java_lang_ClassLoader::offsets_computed = false;
  3993 int  java_lang_ClassLoader::_loader_data_offset = -1;
  3993 int  java_lang_ClassLoader::_loader_data_offset = -1;
  3994 int  java_lang_ClassLoader::parallelCapable_offset = -1;
  3994 int  java_lang_ClassLoader::parallelCapable_offset = -1;
  3995 int  java_lang_ClassLoader::name_offset = -1;
  3995 int  java_lang_ClassLoader::name_offset = -1;
       
  3996 int  java_lang_ClassLoader::nameAndId_offset = -1;
  3996 int  java_lang_ClassLoader::unnamedModule_offset = -1;
  3997 int  java_lang_ClassLoader::unnamedModule_offset = -1;
  3997 
  3998 
  3998 ClassLoaderData* java_lang_ClassLoader::loader_data(oop loader) {
  3999 ClassLoaderData* java_lang_ClassLoader::loader_data(oop loader) {
  3999   assert(loader != NULL && oopDesc::is_oop(loader), "loader must be oop");
  4000   assert(loader != NULL && oopDesc::is_oop(loader), "loader must be oop");
  4000   return HeapAccess<>::load_at(loader, _loader_data_offset);
  4001   return HeapAccess<>::load_at(loader, _loader_data_offset);
  4006 }
  4007 }
  4007 
  4008 
  4008 #define CLASSLOADER_FIELDS_DO(macro) \
  4009 #define CLASSLOADER_FIELDS_DO(macro) \
  4009   macro(parallelCapable_offset, k1, "parallelLockMap",      concurrenthashmap_signature, false); \
  4010   macro(parallelCapable_offset, k1, "parallelLockMap",      concurrenthashmap_signature, false); \
  4010   macro(name_offset,            k1, vmSymbols::name_name(), string_signature, false); \
  4011   macro(name_offset,            k1, vmSymbols::name_name(), string_signature, false); \
       
  4012   macro(nameAndId_offset,       k1, "nameAndId",            string_signature, false); \
  4011   macro(unnamedModule_offset,   k1, "unnamedModule",        module_signature, false); \
  4013   macro(unnamedModule_offset,   k1, "unnamedModule",        module_signature, false); \
  4012   macro(parent_offset,          k1, "parent",               classloader_signature, false)
  4014   macro(parent_offset,          k1, "parent",               classloader_signature, false)
  4013 
  4015 
  4014 void java_lang_ClassLoader::compute_offsets() {
  4016 void java_lang_ClassLoader::compute_offsets() {
  4015   assert(!offsets_computed, "offsets should be initialized only once");
  4017   assert(!offsets_computed, "offsets should be initialized only once");
  4031 oop java_lang_ClassLoader::parent(oop loader) {
  4033 oop java_lang_ClassLoader::parent(oop loader) {
  4032   assert(is_instance(loader), "loader must be oop");
  4034   assert(is_instance(loader), "loader must be oop");
  4033   return loader->obj_field(parent_offset);
  4035   return loader->obj_field(parent_offset);
  4034 }
  4036 }
  4035 
  4037 
       
  4038 // Returns the name field of this class loader.  If the name field has not
       
  4039 // been set, null will be returned.
  4036 oop java_lang_ClassLoader::name(oop loader) {
  4040 oop java_lang_ClassLoader::name(oop loader) {
  4037   assert(is_instance(loader), "loader must be oop");
  4041   assert(is_instance(loader), "loader must be oop");
  4038   return loader->obj_field(name_offset);
  4042   return loader->obj_field(name_offset);
       
  4043 }
       
  4044 
       
  4045 // Returns the nameAndId field of this class loader. The format is
       
  4046 // as follows:
       
  4047 //   If the defining loader has a name explicitly set then '<loader-name>' @<id>
       
  4048 //   If the defining loader has no name then <qualified-class-name> @<id>
       
  4049 //   If built-in loader, then omit '@<id>' as there is only one instance.
       
  4050 // Use ClassLoader::loader_name_id() to obtain this String as a char*.
       
  4051 oop java_lang_ClassLoader::nameAndId(oop loader) {
       
  4052   assert(is_instance(loader), "loader must be oop");
       
  4053   return loader->obj_field(nameAndId_offset);
  4039 }
  4054 }
  4040 
  4055 
  4041 bool java_lang_ClassLoader::isAncestor(oop loader, oop cl) {
  4056 bool java_lang_ClassLoader::isAncestor(oop loader, oop cl) {
  4042   assert(is_instance(loader), "loader must be oop");
  4057   assert(is_instance(loader), "loader must be oop");
  4043   assert(cl == NULL || is_instance(cl), "cl argument must be oop");
  4058   assert(cl == NULL || is_instance(cl), "cl argument must be oop");
  4109   return loader->obj_field(unnamedModule_offset);
  4124   return loader->obj_field(unnamedModule_offset);
  4110 }
  4125 }
  4111 
  4126 
  4112 // Caller needs ResourceMark.
  4127 // Caller needs ResourceMark.
  4113 const char* java_lang_ClassLoader::describe_external(const oop loader) {
  4128 const char* java_lang_ClassLoader::describe_external(const oop loader) {
       
  4129   ClassLoaderData *cld = ClassLoaderData::class_loader_data(loader);
       
  4130   const char* name = cld->loader_name_and_id();
       
  4131 
       
  4132   // bootstrap loader
  4114   if (loader == NULL) {
  4133   if (loader == NULL) {
  4115     return "<bootstrap>";
  4134     return name;
  4116   }
  4135   }
  4117 
  4136 
  4118   bool well_known_loader = SystemDictionary::is_system_class_loader(loader) ||
  4137   bool well_known_loader = SystemDictionary::is_system_class_loader(loader) ||
  4119                            SystemDictionary::is_platform_class_loader(loader);
  4138                            SystemDictionary::is_platform_class_loader(loader);
  4120 
  4139 
  4121   const char* name = NULL;
       
  4122   oop nameOop = java_lang_ClassLoader::name(loader);
       
  4123   if (nameOop != NULL) {
       
  4124     name = java_lang_String::as_utf8_string(nameOop);
       
  4125   }
       
  4126   if (name == NULL) {
       
  4127     // Use placeholder for missing name to have fixed message format.
       
  4128     name = "<unnamed>";
       
  4129   }
       
  4130 
       
  4131   stringStream ss;
  4140   stringStream ss;
  4132   ss.print("\"%s\" (instance of %s", name, loader->klass()->external_name());
  4141   ss.print("%s (instance of %s", name, loader->klass()->external_name());
  4133   if (!well_known_loader) {
  4142   if (!well_known_loader) {
  4134     const char* parentName = NULL;
       
  4135     oop pl = java_lang_ClassLoader::parent(loader);
  4143     oop pl = java_lang_ClassLoader::parent(loader);
       
  4144     ClassLoaderData *pl_cld = ClassLoaderData::class_loader_data(pl);
       
  4145     const char* parentName = pl_cld->loader_name_and_id();
  4136     if (pl != NULL) {
  4146     if (pl != NULL) {
  4137       oop parentNameOop = java_lang_ClassLoader::name(pl);
  4147       ss.print(", child of %s %s", parentName, pl->klass()->external_name());
  4138       if (parentNameOop != NULL) {
       
  4139         parentName = java_lang_String::as_utf8_string(parentNameOop);
       
  4140       }
       
  4141       if (parentName == NULL) {
       
  4142         parentName = "<unnamed>";
       
  4143       }
       
  4144       ss.print(", child of \"%s\" %s", parentName, pl->klass()->external_name());
       
  4145     } else {
  4148     } else {
  4146       ss.print(", child of <bootstrap>");
  4149       // bootstrap loader
       
  4150       ss.print(", child of %s", parentName);
  4147     }
  4151     }
  4148   }
  4152   }
  4149   ss.print(")");
  4153   ss.print(")");
  4150 
  4154 
  4151   return ss.as_string();
  4155   return ss.as_string();