--- a/hotspot/src/share/vm/classfile/modules.cpp Wed Jul 05 23:44:18 2017 +0200
+++ b/hotspot/src/share/vm/classfile/modules.cpp Thu Jun 22 00:51:07 2017 +0200
@@ -162,8 +162,7 @@
}
- // Check that the list of packages has no duplicates and that the
- // packages are syntactically ok.
+ // Check that the packages are syntactically ok.
GrowableArray<Symbol*>* pkg_list = new GrowableArray<Symbol*>(num_packages);
for (int x = 0; x < num_packages; x++) {
const char *package_name = packages[x];
@@ -172,12 +171,7 @@
err_msg("Invalid package name: %s for module: " JAVA_BASE_NAME, package_name));
}
Symbol* pkg_symbol = SymbolTable::new_symbol(package_name, CHECK);
- // append_if_missing() returns FALSE if entry already exists.
- if (!pkg_list->append_if_missing(pkg_symbol)) {
- THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
- err_msg("Duplicate package name: %s for module " JAVA_BASE_NAME,
- package_name));
- }
+ pkg_list->append(pkg_symbol);
}
// Validate java_base's loader is the boot loader.
@@ -186,7 +180,7 @@
THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
"Class loader must be the boot class loader");
}
- Handle h_loader = Handle(THREAD, loader);
+ Handle h_loader(THREAD, loader);
// Ensure the boot loader's PackageEntryTable has been created
PackageEntryTable* package_table = get_package_entry_table(h_loader, CHECK);
@@ -246,9 +240,11 @@
pkg_list->length());
// packages defined to java.base
- for (int x = 0; x < pkg_list->length(); x++) {
- log_trace(module)("define_javabase_module(): creation of package %s for module " JAVA_BASE_NAME,
- (pkg_list->at(x))->as_C_string());
+ if (log_is_enabled(Trace, module)) {
+ for (int x = 0; x < pkg_list->length(); x++) {
+ log_trace(module)("define_javabase_module(): creation of package %s for module " JAVA_BASE_NAME,
+ (pkg_list->at(x))->as_C_string());
+ }
}
}
@@ -266,7 +262,7 @@
}
}
-void Modules::define_module(jobject module, jstring version,
+void Modules::define_module(jobject module, jboolean is_open, jstring version,
jstring location, const char* const* packages,
jsize num_packages, TRAPS) {
ResourceMark rm(THREAD);
@@ -299,6 +295,7 @@
// Special handling of java.base definition
if (strcmp(module_name, JAVA_BASE_NAME) == 0) {
+ assert(is_open == JNI_FALSE, "java.base module cannot be open");
define_javabase_module(module, version, location, packages, num_packages, CHECK);
return;
}
@@ -326,7 +323,7 @@
// Only modules defined to either the boot or platform class loader, can define a "java/" package.
if (!h_loader.is_null() &&
- !SystemDictionary::is_platform_class_loader(h_loader) &&
+ !SystemDictionary::is_platform_class_loader(h_loader()) &&
(strncmp(package_name, JAVAPKG, JAVAPKG_LEN) == 0 &&
(package_name[JAVAPKG_LEN] == '/' || package_name[JAVAPKG_LEN] == '\0'))) {
const char* class_loader_name = SystemDictionary::loader_name(h_loader());
@@ -343,12 +340,7 @@
}
Symbol* pkg_symbol = SymbolTable::new_symbol(package_name, CHECK);
- // append_if_missing() returns FALSE if entry already exists.
- if (!pkg_list->append_if_missing(pkg_symbol)) {
- THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
- err_msg("Duplicate package name: %s for module %s",
- package_name, module_name));
- }
+ pkg_list->append(pkg_symbol);
}
ModuleEntryTable* module_table = get_module_entry_table(h_loader, CHECK);
@@ -407,7 +399,8 @@
// Add the module and its packages.
if (!dupl_modules && existing_pkg == NULL) {
// Create the entry for this module in the class loader's module entry table.
- ModuleEntry* module_entry = module_table->locked_create_entry_or_null(module_handle, module_symbol,
+ ModuleEntry* module_entry = module_table->locked_create_entry_or_null(module_handle,
+ (is_open == JNI_TRUE), module_symbol,
version_symbol, location_symbol, loader_data);
if (module_entry == NULL) {
@@ -456,9 +449,8 @@
}
// If the module is defined to the boot loader and an exploded build is being
- // used, prepend <java.home>/modules/modules_name, if it exists, to the system boot class path.
- if (loader == NULL &&
- !ClassLoader::has_jrt_entry()) {
+ // used, prepend <java.home>/modules/modules_name to the system boot class path.
+ if (loader == NULL && !ClassLoader::has_jrt_entry()) {
ClassLoader::add_to_exploded_build_list(module_symbol, CHECK);
}
}
@@ -488,17 +480,15 @@
THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
"Class loader must be the boot class loader");
}
- Handle h_loader = Handle(THREAD, loader);
+ Handle h_loader(THREAD, loader);
log_debug(module)("set_bootloader_unnamed_module(): recording unnamed module for boot loader");
- // Ensure the boot loader's PackageEntryTable has been created
- ModuleEntryTable* module_table = get_module_entry_table(h_loader, CHECK);
-
// Set java.lang.Module for the boot loader's unnamed module
- ModuleEntry* unnamed_module = module_table->unnamed_module();
+ ClassLoaderData* boot_loader_data = ClassLoaderData::the_null_class_loader_data();
+ ModuleEntry* unnamed_module = boot_loader_data->unnamed_module();
assert(unnamed_module != NULL, "boot loader's unnamed ModuleEntry not defined");
- unnamed_module->set_module(ClassLoaderData::the_null_class_loader_data()->add_handle(module_handle));
+ unnamed_module->set_module(boot_loader_data->add_handle(module_handle));
// Store pointer to the ModuleEntry in the unnamed module's java.lang.Module object.
java_lang_Module::set_module_entry(module_handle(), unnamed_module);
}
@@ -518,8 +508,8 @@
"from_module cannot be found");
}
- // All packages in unnamed are exported by default.
- if (!from_module_entry->is_named()) return;
+ // All packages in unnamed and open modules are exported by default.
+ if (!from_module_entry->is_named() || from_module_entry->is_open()) return;
ModuleEntry* to_module_entry;
if (to_module == NULL) {
@@ -653,39 +643,6 @@
return JNIHandles::make_local(THREAD, module);
}
-
-jobject Modules::get_module_by_package_name(jobject loader, const char* package_name, TRAPS) {
- ResourceMark rm(THREAD);
- assert(ModuleEntryTable::javabase_defined(),
- "Attempt to call get_module_from_pkg before " JAVA_BASE_NAME " is defined");
-
- if (package_name == NULL) {
- THROW_MSG_(vmSymbols::java_lang_NullPointerException(),
- "package is null", JNI_FALSE);
- }
-
- Handle h_loader (THREAD, JNIHandles::resolve(loader));
- // Check that loader is a subclass of java.lang.ClassLoader.
- if (loader != NULL && !java_lang_ClassLoader::is_subclass(h_loader->klass())) {
- THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(),
- "Class loader is not a subclass of java.lang.ClassLoader", JNI_FALSE);
- }
-
- if (strlen(package_name) == 0) {
- // Return the unnamed module
- ModuleEntryTable* module_table = get_module_entry_table(h_loader, CHECK_NULL);
- if (NULL == module_table) return NULL;
- const ModuleEntry* const unnamed_module = module_table->unnamed_module();
- return JNIHandles::make_local(THREAD, JNIHandles::resolve(unnamed_module->module()));
-
- } else {
- TempNewSymbol package_sym = SymbolTable::new_symbol(package_name, CHECK_NULL);
- return get_module(package_sym, h_loader, CHECK_NULL);
- }
- return NULL;
-}
-
-
jobject Modules::get_named_module(Handle h_loader, const char* package_name, TRAPS) {
assert(ModuleEntryTable::javabase_defined(),
"Attempt to call get_named_module before " JAVA_BASE_NAME " is defined");