< prev index next >

src/share/vm/classfile/modules.cpp

Print this page




 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   }


< prev index next >