8249262: Initialize InstanceKlass::_package_entry during CDS dump time

Reviewed-by: iklam, minqi
This commit is contained in:
Calvin Cheung 2021-01-28 16:17:46 +00:00
parent 3aabbd7216
commit bbbfaa58c0
7 changed files with 64 additions and 13 deletions

View file

@ -1053,11 +1053,19 @@ InstanceKlass* SystemDictionaryShared::find_or_load_shared_class(
return k;
}
PackageEntry* SystemDictionaryShared::get_package_entry_from_class_name(Handle class_loader, Symbol* class_name) {
PackageEntry* pkg_entry = NULL;
TempNewSymbol pkg_name = ClassLoader::package_from_class_name(class_name);
PackageEntry* SystemDictionaryShared::get_package_entry_from_class(InstanceKlass* ik, Handle class_loader) {
PackageEntry* pkg_entry = ik->package();
if (MetaspaceShared::use_full_module_graph() && ik->is_shared() && pkg_entry != NULL) {
assert(MetaspaceShared::is_in_shared_metaspace(pkg_entry), "must be");
assert(!ik->is_shared_unregistered_class(), "unexpected archived package entry for an unregistered class");
assert(ik->module()->is_named(), "unexpected archived package entry for a class in an unnamed module");
return pkg_entry;
}
TempNewSymbol pkg_name = ClassLoader::package_from_class_name(ik->name());
if (pkg_name != NULL) {
pkg_entry = class_loader_data(class_loader)->packages()->lookup_only(pkg_name);
} else {
pkg_entry = NULL;
}
return pkg_entry;
}
@ -1072,7 +1080,7 @@ InstanceKlass* SystemDictionaryShared::load_shared_class_for_builtin_loader(
SystemDictionary::is_system_class_loader(class_loader())) ||
(ik->is_shared_platform_class() &&
SystemDictionary::is_platform_class_loader(class_loader()))) {
PackageEntry* pkg_entry = get_package_entry_from_class_name(class_loader, class_name);
PackageEntry* pkg_entry = get_package_entry_from_class(ik, class_loader);
Handle protection_domain =
SystemDictionaryShared::init_security_info(class_loader, ik, pkg_entry, CHECK_NULL);
return load_shared_class(ik, class_loader, protection_domain, NULL, pkg_entry, THREAD);
@ -1172,7 +1180,7 @@ InstanceKlass* SystemDictionaryShared::acquire_class_for_current_thread(
loader_data->add_class(ik);
// Get the package entry.
PackageEntry* pkg_entry = get_package_entry_from_class_name(class_loader, ik->name());
PackageEntry* pkg_entry = get_package_entry_from_class(ik, class_loader);
// Load and check super/interfaces, restore unsharable info
InstanceKlass* shared_klass = load_shared_class(ik, class_loader, protection_domain,
@ -1684,7 +1692,7 @@ InstanceKlass* SystemDictionaryShared::prepare_shared_lambda_proxy_class(Instanc
InstanceKlass* caller_ik, TRAPS) {
Handle class_loader(THREAD, caller_ik->class_loader());
Handle protection_domain;
PackageEntry* pkg_entry = get_package_entry_from_class_name(class_loader, caller_ik->name());
PackageEntry* pkg_entry = get_package_entry_from_class(caller_ik, class_loader);
if (caller_ik->class_loader() != NULL) {
protection_domain = SystemDictionaryShared::init_security_info(class_loader, caller_ik, pkg_entry, CHECK_NULL);
}