< prev index next >

src/share/vm/classfile/modules.cpp

Print this page




 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   }


< prev index next >