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(); |