227 }
228 }
229 if (duplicate_javabase) {
230 THROW_MSG(vmSymbols::java_lang_InternalError(),
231 "Module " JAVA_BASE_NAME " is already defined");
232 }
233
234 // Only the thread that actually defined the base module will get here,
235 // so no locking is needed.
236
237 // Patch any previously loaded class's module field with java.base's java.lang.reflect.Module.
238 ModuleEntryTable::patch_javabase_entries(module_handle);
239
240 log_debug(modules)("define_javabase_module(): Definition of module: "
241 JAVA_BASE_NAME ", version: %s, location: %s, package #: %d",
242 module_version != NULL ? module_version : "NULL",
243 module_location != NULL ? module_location : "NULL",
244 pkg_list->length());
245
246 // packages defined to java.base
247 for (int x = 0; x < pkg_list->length(); x++) {
248 log_trace(modules)("define_javabase_module(): creation of package %s for module " JAVA_BASE_NAME,
249 (pkg_list->at(x))->as_C_string());
250 }
251 }
252
253 // Caller needs ResourceMark.
254 void throw_dup_pkg_exception(const char* module_name, PackageEntry* package, TRAPS) {
255 const char* package_name = package->name()->as_C_string();
256 if (package->module()->is_named()) {
257 THROW_MSG(vmSymbols::java_lang_IllegalStateException(),
258 err_msg("Package %s for module %s is already in another module, %s, defined to the class loader",
259 package_name, module_name, package->module()->name()->as_C_string()));
260 } else {
261 THROW_MSG(vmSymbols::java_lang_IllegalStateException(),
262 err_msg("Package %s for module %s is already in the unnamed module defined to the class loader",
263 package_name, module_name));
264 }
265 }
266
267 void Modules::define_module(jobject module, jstring version,
268 jstring location, const char* const* packages,
269 jsize num_packages, TRAPS) {
270 ResourceMark rm(THREAD);
271
272 if (module == NULL) {
273 THROW_MSG(vmSymbols::java_lang_NullPointerException(), "Null module object");
274 }
275
276 if (num_packages < 0) {
277 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
278 "num_packages must be >= 0");
279 }
280
281 if (packages == NULL && num_packages > 0) {
282 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
283 "num_packages should be zero if packages is null");
284 }
285
286 Handle module_handle(THREAD, JNIHandles::resolve(module));
287 if (!java_lang_reflect_Module::is_instance(module_handle())) {
387 package_table = get_package_entry_table(h_loader, CHECK);
388 assert(package_table != NULL, "Missing package_table");
389
390 // Check that none of the packages exist in the class loader's package table.
391 for (int x = 0; x < pkg_list->length(); x++) {
392 existing_pkg = package_table->lookup_only(pkg_list->at(x));
393 if (existing_pkg != NULL) {
394 // This could be because the module was already defined. If so,
395 // report that error instead of the package error.
396 if (module_table->lookup_only(module_symbol) != NULL) {
397 dupl_modules = true;
398 }
399 break;
400 }
401 }
402 } // if (num_packages > 0)...
403
404 // Add the module and its packages.
405 if (!dupl_modules && existing_pkg == NULL) {
406 // Create the entry for this module in the class loader's module entry table.
407 ModuleEntry* module_entry = module_table->locked_create_entry_or_null(module_handle, module_symbol,
408 version_symbol, location_symbol, loader_data);
409
410 if (module_entry == NULL) {
411 dupl_modules = true;
412 } else {
413 // Add the packages.
414 assert(pkg_list->length() == 0 || package_table != NULL, "Bad package table");
415 PackageEntry* pkg;
416 for (int y = 0; y < pkg_list->length(); y++) {
417 pkg = package_table->locked_create_entry_or_null(pkg_list->at(y), module_entry);
418 assert(pkg != NULL, "Unable to create a module's package entry");
419
420 // Unable to have a GrowableArray of TempNewSymbol. Must decrement the refcount of
421 // the Symbol* that was created above for each package. The refcount was incremented
422 // by SymbolTable::new_symbol and as well by the PackageEntry creation.
423 pkg_list->at(y)->decrement_refcount();
424 }
425
426 // Store pointer to ModuleEntry record in java.lang.reflect.Module object.
427 java_lang_reflect_Module::set_module_entry(module_handle(), module_entry);
497 unnamed_module->set_module(ClassLoaderData::the_null_class_loader_data()->add_handle(module_handle));
498 // Store pointer to the ModuleEntry in the unnamed module's java.lang.reflect.Module object.
499 java_lang_reflect_Module::set_module_entry(module_handle(), unnamed_module);
500 }
501
502 void Modules::add_module_exports(jobject from_module, const char* package_name, jobject to_module, TRAPS) {
503 if (package_name == NULL) {
504 THROW_MSG(vmSymbols::java_lang_NullPointerException(),
505 "package is null");
506 }
507 if (from_module == NULL) {
508 THROW_MSG(vmSymbols::java_lang_NullPointerException(),
509 "from_module is null");
510 }
511 ModuleEntry* from_module_entry = get_module_entry(from_module, CHECK);
512 if (from_module_entry == NULL) {
513 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
514 "from_module cannot be found");
515 }
516
517 // All packages in unnamed are exported by default.
518 if (!from_module_entry->is_named()) return;
519
520 ModuleEntry* to_module_entry;
521 if (to_module == NULL) {
522 to_module_entry = NULL; // It's an unqualified export.
523 } else {
524 to_module_entry = get_module_entry(to_module, CHECK);
525 if (to_module_entry == NULL) {
526 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
527 "to_module is invalid");
528 }
529 }
530
531 PackageEntry *package_entry = get_package_entry(from_module_entry, package_name, CHECK);
532 ResourceMark rm(THREAD);
533 if (package_entry == NULL) {
534 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
535 err_msg("Package %s not found in from_module %s",
536 package_name != NULL ? package_name : "",
537 from_module_entry->name()->as_C_string()));
538 }
|
227 }
228 }
229 if (duplicate_javabase) {
230 THROW_MSG(vmSymbols::java_lang_InternalError(),
231 "Module " JAVA_BASE_NAME " is already defined");
232 }
233
234 // Only the thread that actually defined the base module will get here,
235 // so no locking is needed.
236
237 // Patch any previously loaded class's module field with java.base's java.lang.reflect.Module.
238 ModuleEntryTable::patch_javabase_entries(module_handle);
239
240 log_debug(modules)("define_javabase_module(): Definition of module: "
241 JAVA_BASE_NAME ", version: %s, location: %s, package #: %d",
242 module_version != NULL ? module_version : "NULL",
243 module_location != NULL ? module_location : "NULL",
244 pkg_list->length());
245
246 // packages defined to java.base
247 if (log_is_enabled(Trace, modules)) {
248 for (int x = 0; x < pkg_list->length(); x++) {
249 log_trace(modules)("define_javabase_module(): creation of package %s for module " JAVA_BASE_NAME,
250 (pkg_list->at(x))->as_C_string());
251 }
252 }
253 }
254
255 // Caller needs ResourceMark.
256 void throw_dup_pkg_exception(const char* module_name, PackageEntry* package, TRAPS) {
257 const char* package_name = package->name()->as_C_string();
258 if (package->module()->is_named()) {
259 THROW_MSG(vmSymbols::java_lang_IllegalStateException(),
260 err_msg("Package %s for module %s is already in another module, %s, defined to the class loader",
261 package_name, module_name, package->module()->name()->as_C_string()));
262 } else {
263 THROW_MSG(vmSymbols::java_lang_IllegalStateException(),
264 err_msg("Package %s for module %s is already in the unnamed module defined to the class loader",
265 package_name, module_name));
266 }
267 }
268
269 void Modules::define_module(jobject module, jboolean is_open, jstring version,
270 jstring location, const char* const* packages,
271 jsize num_packages, TRAPS) {
272 ResourceMark rm(THREAD);
273
274 if (module == NULL) {
275 THROW_MSG(vmSymbols::java_lang_NullPointerException(), "Null module object");
276 }
277
278 if (num_packages < 0) {
279 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
280 "num_packages must be >= 0");
281 }
282
283 if (packages == NULL && num_packages > 0) {
284 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
285 "num_packages should be zero if packages is null");
286 }
287
288 Handle module_handle(THREAD, JNIHandles::resolve(module));
289 if (!java_lang_reflect_Module::is_instance(module_handle())) {
389 package_table = get_package_entry_table(h_loader, CHECK);
390 assert(package_table != NULL, "Missing package_table");
391
392 // Check that none of the packages exist in the class loader's package table.
393 for (int x = 0; x < pkg_list->length(); x++) {
394 existing_pkg = package_table->lookup_only(pkg_list->at(x));
395 if (existing_pkg != NULL) {
396 // This could be because the module was already defined. If so,
397 // report that error instead of the package error.
398 if (module_table->lookup_only(module_symbol) != NULL) {
399 dupl_modules = true;
400 }
401 break;
402 }
403 }
404 } // if (num_packages > 0)...
405
406 // Add the module and its packages.
407 if (!dupl_modules && existing_pkg == NULL) {
408 // Create the entry for this module in the class loader's module entry table.
409 ModuleEntry* module_entry = module_table->locked_create_entry_or_null(module_handle,
410 (is_open == JNI_TRUE), module_symbol,
411 version_symbol, location_symbol, loader_data);
412
413 if (module_entry == NULL) {
414 dupl_modules = true;
415 } else {
416 // Add the packages.
417 assert(pkg_list->length() == 0 || package_table != NULL, "Bad package table");
418 PackageEntry* pkg;
419 for (int y = 0; y < pkg_list->length(); y++) {
420 pkg = package_table->locked_create_entry_or_null(pkg_list->at(y), module_entry);
421 assert(pkg != NULL, "Unable to create a module's package entry");
422
423 // Unable to have a GrowableArray of TempNewSymbol. Must decrement the refcount of
424 // the Symbol* that was created above for each package. The refcount was incremented
425 // by SymbolTable::new_symbol and as well by the PackageEntry creation.
426 pkg_list->at(y)->decrement_refcount();
427 }
428
429 // Store pointer to ModuleEntry record in java.lang.reflect.Module object.
430 java_lang_reflect_Module::set_module_entry(module_handle(), module_entry);
500 unnamed_module->set_module(ClassLoaderData::the_null_class_loader_data()->add_handle(module_handle));
501 // Store pointer to the ModuleEntry in the unnamed module's java.lang.reflect.Module object.
502 java_lang_reflect_Module::set_module_entry(module_handle(), unnamed_module);
503 }
504
505 void Modules::add_module_exports(jobject from_module, const char* package_name, jobject to_module, TRAPS) {
506 if (package_name == NULL) {
507 THROW_MSG(vmSymbols::java_lang_NullPointerException(),
508 "package is null");
509 }
510 if (from_module == NULL) {
511 THROW_MSG(vmSymbols::java_lang_NullPointerException(),
512 "from_module is null");
513 }
514 ModuleEntry* from_module_entry = get_module_entry(from_module, CHECK);
515 if (from_module_entry == NULL) {
516 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
517 "from_module cannot be found");
518 }
519
520 // All packages in unnamed and open modules are exported by default.
521 if (!from_module_entry->is_named() || from_module_entry->is_open()) return;
522
523 ModuleEntry* to_module_entry;
524 if (to_module == NULL) {
525 to_module_entry = NULL; // It's an unqualified export.
526 } else {
527 to_module_entry = get_module_entry(to_module, CHECK);
528 if (to_module_entry == NULL) {
529 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
530 "to_module is invalid");
531 }
532 }
533
534 PackageEntry *package_entry = get_package_entry(from_module_entry, package_name, CHECK);
535 ResourceMark rm(THREAD);
536 if (package_entry == NULL) {
537 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
538 err_msg("Package %s not found in from_module %s",
539 package_name != NULL ? package_name : "",
540 from_module_entry->name()->as_C_string()));
541 }
|