189 if (!pkg_list->append_if_missing(pkg_symbol)) { 190 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), 191 err_msg("Duplicate package name: %s for module java.base", 192 package_name)); 193 } 194 } 195 196 // Validate java_base's loader is the boot loader. 197 oop loader = java_lang_reflect_Module::loader(module_handle()); 198 if (loader != NULL) { 199 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), 200 "Class loader must be the boot class loader"); 201 } 202 Handle h_loader = Handle(THREAD, loader); 203 204 // Ensure the boot loader's PackageEntryTable has been created 205 PackageEntryTable* package_table = get_package_entry_table(h_loader, CHECK); 206 assert(pkg_list->length() == 0 || package_table != NULL, "Bad package_table"); 207 208 // Ensure java.base's ModuleEntry has been created 209 assert(ModuleEntryTable::javabase_module() != NULL, "No ModuleEntry for java.base"); 210 211 bool duplicate_javabase = false; 212 { 213 MutexLocker m1(Module_lock, THREAD); 214 215 if (ModuleEntryTable::javabase_defined()) { 216 duplicate_javabase = true; 217 } else { 218 219 // Verify that all java.base packages created during bootstrapping are in 220 // pkg_list. If any are not in pkg_list, than a non-java.base class was 221 // loaded erroneously pre java.base module definition. 222 package_table->verify_javabase_packages(pkg_list); 223 224 // loop through and add any new packages for java.base 225 PackageEntry* pkg; 226 for (int x = 0; x < pkg_list->length(); x++) { 227 // Some of java.base's packages were added early in bootstrapping, ignore duplicates. 228 if (package_table->lookup_only(pkg_list->at(x)) == NULL) { 229 pkg = package_table->locked_create_entry_or_null(pkg_list->at(x), ModuleEntryTable::javabase_module()); 230 assert(pkg != NULL, "Unable to create a java.base package entry"); 231 } 232 // Unable to have a GrowableArray of TempNewSymbol. Must decrement the refcount of 233 // the Symbol* that was created above for each package. The refcount was incremented 234 // by SymbolTable::new_symbol and as well by the PackageEntry creation. 235 pkg_list->at(x)->decrement_refcount(); 236 } 237 238 // Finish defining java.base's ModuleEntry 239 ModuleEntryTable::finalize_javabase(module_handle, version_symbol, location_symbol); 240 } 241 } 242 if (duplicate_javabase) { 243 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), 244 "Module java.base is already defined"); 245 } 246 247 log_debug(modules)("define_javabase_module(): Definition of module: java.base," 248 " version: %s, location: %s, package #: %d", 249 module_version != NULL ? module_version : "NULL", 250 module_location != NULL ? module_location : "NULL", 251 pkg_list->length()); 252 253 // packages defined to java.base 254 for (int x = 0; x < pkg_list->length(); x++) { 255 log_trace(modules)("define_javabase_module(): creation of package %s for module java.base", 256 (pkg_list->at(x))->as_C_string()); 257 } 258 259 // Patch any previously loaded classes' module field with java.base's jlr.Module. 260 ModuleEntryTable::patch_javabase_entries(module_handle); 261 } 262 263 void Modules::define_module(jobject module, jstring version, 264 jstring location, jobjectArray packages, TRAPS) { 265 ResourceMark rm(THREAD); 266 267 if (module == NULL) { 268 THROW_MSG(vmSymbols::java_lang_NullPointerException(), "Null module object"); 269 } 270 Handle module_handle(THREAD, JNIHandles::resolve(module)); 271 if (!java_lang_reflect_Module::is_instance(module_handle())) { 272 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), 273 "module is not an instance of type java.lang.reflect.Module"); 274 } 275 276 char* module_name = get_module_name(module_handle(), CHECK); 277 if (module_name == NULL) { 278 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), 279 "Module name cannot be null"); 280 } | 189 if (!pkg_list->append_if_missing(pkg_symbol)) { 190 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), 191 err_msg("Duplicate package name: %s for module java.base", 192 package_name)); 193 } 194 } 195 196 // Validate java_base's loader is the boot loader. 197 oop loader = java_lang_reflect_Module::loader(module_handle()); 198 if (loader != NULL) { 199 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), 200 "Class loader must be the boot class loader"); 201 } 202 Handle h_loader = Handle(THREAD, loader); 203 204 // Ensure the boot loader's PackageEntryTable has been created 205 PackageEntryTable* package_table = get_package_entry_table(h_loader, CHECK); 206 assert(pkg_list->length() == 0 || package_table != NULL, "Bad package_table"); 207 208 // Ensure java.base's ModuleEntry has been created 209 assert(ModuleEntryTable::javabase_moduleEntry() != NULL, "No ModuleEntry for java.base"); 210 211 bool duplicate_javabase = false; 212 { 213 MutexLocker m1(Module_lock, THREAD); 214 215 if (ModuleEntryTable::javabase_defined()) { 216 duplicate_javabase = true; 217 } else { 218 219 // Verify that all java.base packages created during bootstrapping are in 220 // pkg_list. If any are not in pkg_list, than a non-java.base class was 221 // loaded erroneously pre java.base module definition. 222 package_table->verify_javabase_packages(pkg_list); 223 224 // loop through and add any new packages for java.base 225 PackageEntry* pkg; 226 for (int x = 0; x < pkg_list->length(); x++) { 227 // Some of java.base's packages were added early in bootstrapping, ignore duplicates. 228 if (package_table->lookup_only(pkg_list->at(x)) == NULL) { 229 pkg = package_table->locked_create_entry_or_null(pkg_list->at(x), ModuleEntryTable::javabase_moduleEntry()); 230 assert(pkg != NULL, "Unable to create a java.base package entry"); 231 } 232 // Unable to have a GrowableArray of TempNewSymbol. Must decrement the refcount of 233 // the Symbol* that was created above for each package. The refcount was incremented 234 // by SymbolTable::new_symbol and as well by the PackageEntry creation. 235 pkg_list->at(x)->decrement_refcount(); 236 } 237 238 // Finish defining java.base's ModuleEntry 239 ModuleEntryTable::finalize_javabase(module_handle, version_symbol, location_symbol); 240 } 241 } 242 if (duplicate_javabase) { 243 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), 244 "Module java.base is already defined"); 245 } 246 247 log_debug(modules)("define_javabase_module(): Definition of module: java.base," 248 " version: %s, location: %s, package #: %d", 249 module_version != NULL ? module_version : "NULL", 250 module_location != NULL ? module_location : "NULL", 251 pkg_list->length()); 252 253 // packages defined to java.base 254 for (int x = 0; x < pkg_list->length(); x++) { 255 log_trace(modules)("define_javabase_module(): creation of package %s for module java.base", 256 (pkg_list->at(x))->as_C_string()); 257 } 258 } 259 260 void Modules::define_module(jobject module, jstring version, 261 jstring location, jobjectArray packages, TRAPS) { 262 ResourceMark rm(THREAD); 263 264 if (module == NULL) { 265 THROW_MSG(vmSymbols::java_lang_NullPointerException(), "Null module object"); 266 } 267 Handle module_handle(THREAD, JNIHandles::resolve(module)); 268 if (!java_lang_reflect_Module::is_instance(module_handle())) { 269 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), 270 "module is not an instance of type java.lang.reflect.Module"); 271 } 272 273 char* module_name = get_module_name(module_handle(), CHECK); 274 if (module_name == NULL) { 275 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), 276 "Module name cannot be null"); 277 } |