< prev index next >

src/hotspot/share/classfile/modules.cpp

Print this page




  67   oop name_oop = java_lang_Module::name(module);
  68   if (name_oop == NULL) {
  69     THROW_MSG_NULL(vmSymbols::java_lang_NullPointerException(), "Null module name");
  70   }
  71   char* module_name = java_lang_String::as_utf8_string(name_oop);
  72   if (!verify_module_name(module_name)) {
  73     THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(),
  74                    err_msg("Invalid module name: %s",
  75                            module_name != NULL ? module_name : "NULL"));
  76   }
  77   return module_name;
  78 }
  79 
  80 static const char* get_module_version(jstring version) {
  81   if (version == NULL) {
  82     return NULL;
  83   }
  84   return java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(version));
  85 }
  86 
  87 static ModuleEntryTable* get_module_entry_table(Handle h_loader, TRAPS) {
  88   // This code can be called during start-up, before the classLoader's classLoader data got
  89   // created.  So, call register_loader() to make sure the classLoader data gets created.
  90   ClassLoaderData *loader_cld = SystemDictionary::register_loader(h_loader, CHECK_NULL);
  91   return loader_cld->modules();
  92 }
  93 
  94 static PackageEntryTable* get_package_entry_table(Handle h_loader, TRAPS) {
  95   // This code can be called during start-up, before the classLoader's classLoader data got
  96   // created.  So, call register_loader() to make sure the classLoader data gets created.
  97   ClassLoaderData *loader_cld = SystemDictionary::register_loader(h_loader, CHECK_NULL);
  98   return loader_cld->packages();
  99 }
 100 
 101 static ModuleEntry* get_module_entry(jobject module, TRAPS) {
 102   Handle module_h(THREAD, JNIHandles::resolve(module));
 103   if (!java_lang_Module::is_instance(module_h())) {
 104     THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(),
 105                    "module is not an instance of type java.lang.Module");
 106   }
 107   return java_lang_Module::module_entry(module_h(), CHECK_NULL);
 108 }
 109 
 110 static PackageEntry* get_package_entry(ModuleEntry* module_entry, const char* package_name, TRAPS) {
 111   ResourceMark rm(THREAD);
 112   if (package_name == NULL) return NULL;
 113   TempNewSymbol pkg_symbol = SymbolTable::new_symbol(package_name, CHECK_NULL);
 114   PackageEntryTable* package_entry_table = module_entry->loader_data()->packages();
 115   assert(package_entry_table != NULL, "Unexpected null package entry table");
 116   return package_entry_table->lookup_only(pkg_symbol);
 117 }
 118 
 119 static PackageEntry* get_package_entry_by_name(Symbol* package,
 120                                                Handle h_loader,
 121                                                TRAPS) {
 122   if (package != NULL) {
 123     ResourceMark rm(THREAD);
 124     if (Modules::verify_package_name(package->as_C_string())) {
 125       PackageEntryTable* const package_entry_table =
 126         get_package_entry_table(h_loader, CHECK_NULL);
 127       assert(package_entry_table != NULL, "Unexpected null package entry table");
 128       return package_entry_table->lookup_only(package);
 129     }
 130   }
 131   return NULL;
 132 }
 133 
 134 bool Modules::is_package_defined(Symbol* package, Handle h_loader, TRAPS) {
 135   PackageEntry* res = get_package_entry_by_name(package, h_loader, CHECK_false);
 136   return res != NULL;
 137 }
 138 
 139 static void define_javabase_module(jobject module, jstring version,
 140                                    jstring location, const char* const* packages,
 141                                    jsize num_packages, TRAPS) {
 142   ResourceMark rm(THREAD);
 143 
 144   Handle module_handle(THREAD, JNIHandles::resolve(module));
 145 
 146   // Obtain java.base's module version


 168   GrowableArray<Symbol*>* pkg_list = new GrowableArray<Symbol*>(num_packages);
 169   for (int x = 0; x < num_packages; x++) {
 170     const char *package_name = packages[x];
 171     if (!Modules::verify_package_name(package_name)) {
 172       THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
 173                 err_msg("Invalid package name: %s for module: " JAVA_BASE_NAME, package_name));
 174     }
 175     Symbol* pkg_symbol = SymbolTable::new_symbol(package_name, CHECK);
 176     pkg_list->append(pkg_symbol);
 177   }
 178 
 179   // Validate java_base's loader is the boot loader.
 180   oop loader = java_lang_Module::loader(module_handle());
 181   if (loader != NULL) {
 182     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
 183               "Class loader must be the boot class loader");
 184   }
 185   Handle h_loader(THREAD, loader);
 186 
 187   // Ensure the boot loader's PackageEntryTable has been created
 188   PackageEntryTable* package_table = get_package_entry_table(h_loader, CHECK);
 189   assert(pkg_list->length() == 0 || package_table != NULL, "Bad package_table");
 190 
 191   // Ensure java.base's ModuleEntry has been created
 192   assert(ModuleEntryTable::javabase_moduleEntry() != NULL, "No ModuleEntry for " JAVA_BASE_NAME);
 193 
 194   bool duplicate_javabase = false;
 195   {
 196     MutexLocker m1(Module_lock, THREAD);
 197 
 198     if (ModuleEntryTable::javabase_defined()) {
 199       duplicate_javabase = true;
 200     } else {
 201 
 202       // Verify that all java.base packages created during bootstrapping are in
 203       // pkg_list.  If any are not in pkg_list, than a non-java.base class was
 204       // loaded erroneously pre java.base module definition.
 205       package_table->verify_javabase_packages(pkg_list);
 206 
 207       // loop through and add any new packages for java.base
 208       PackageEntry* pkg;


 328         !SystemDictionary::is_platform_class_loader(h_loader()) &&
 329         (strncmp(package_name, JAVAPKG, JAVAPKG_LEN) == 0 &&
 330           (package_name[JAVAPKG_LEN] == '/' || package_name[JAVAPKG_LEN] == '\0'))) {
 331       const char* class_loader_name = SystemDictionary::loader_name(h_loader());
 332       size_t pkg_len = strlen(package_name);
 333       char* pkg_name = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, pkg_len);
 334       strncpy(pkg_name, package_name, pkg_len);
 335       StringUtils::replace_no_expand(pkg_name, "/", ".");
 336       const char* msg_text1 = "Class loader (instance of): ";
 337       const char* msg_text2 = " tried to define prohibited package name: ";
 338       size_t len = strlen(msg_text1) + strlen(class_loader_name) + strlen(msg_text2) + pkg_len + 1;
 339       char* message = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, len);
 340       jio_snprintf(message, len, "%s%s%s%s", msg_text1, class_loader_name, msg_text2, pkg_name);
 341       THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), message);
 342     }
 343 
 344     Symbol* pkg_symbol = SymbolTable::new_symbol(package_name, CHECK);
 345     pkg_list->append(pkg_symbol);
 346   }
 347 
 348   ModuleEntryTable* module_table = get_module_entry_table(h_loader, CHECK);
 349   assert(module_table != NULL, "module entry table shouldn't be null");
 350 
 351   // Create symbol* entry for module name.
 352   TempNewSymbol module_symbol = SymbolTable::new_symbol(module_name, CHECK);
 353 
 354   bool dupl_modules = false;
 355 
 356   // Create symbol* entry for module version.
 357   TempNewSymbol version_symbol;
 358   if (module_version != NULL) {
 359     version_symbol = SymbolTable::new_symbol(module_version, CHECK);
 360   } else {
 361     version_symbol = NULL;
 362   }
 363 
 364   // Create symbol* entry for module location.
 365   const char* module_location = NULL;
 366   TempNewSymbol location_symbol = NULL;
 367   if (location != NULL) {
 368     module_location =
 369       java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(location));
 370     if (module_location != NULL) {
 371       location_symbol = SymbolTable::new_symbol(module_location, CHECK);
 372     }
 373   }
 374 
 375   ClassLoaderData* loader_data = ClassLoaderData::class_loader_data_or_null(h_loader());
 376   assert(loader_data != NULL, "class loader data shouldn't be null");
 377 
 378   PackageEntryTable* package_table = NULL;
 379   PackageEntry* existing_pkg = NULL;
 380   {
 381     MutexLocker ml(Module_lock, THREAD);
 382 
 383     if (num_packages > 0) {
 384       package_table = get_package_entry_table(h_loader, CHECK);
 385       assert(package_table != NULL, "Missing package_table");
 386 
 387       // Check that none of the packages exist in the class loader's package table.
 388       for (int x = 0; x < pkg_list->length(); x++) {
 389         existing_pkg = package_table->lookup_only(pkg_list->at(x));
 390         if (existing_pkg != NULL) {
 391           // This could be because the module was already defined.  If so,
 392           // report that error instead of the package error.
 393           if (module_table->lookup_only(module_symbol) != NULL) {
 394             dupl_modules = true;
 395           }
 396           break;
 397         }
 398       }
 399     }  // if (num_packages > 0)...
 400 
 401     // Add the module and its packages.
 402     if (!dupl_modules && existing_pkg == NULL) {
 403       // Create the entry for this module in the class loader's module entry table.
 404       ModuleEntry* module_entry = module_table->locked_create_entry_or_null(module_handle,




  67   oop name_oop = java_lang_Module::name(module);
  68   if (name_oop == NULL) {
  69     THROW_MSG_NULL(vmSymbols::java_lang_NullPointerException(), "Null module name");
  70   }
  71   char* module_name = java_lang_String::as_utf8_string(name_oop);
  72   if (!verify_module_name(module_name)) {
  73     THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(),
  74                    err_msg("Invalid module name: %s",
  75                            module_name != NULL ? module_name : "NULL"));
  76   }
  77   return module_name;
  78 }
  79 
  80 static const char* get_module_version(jstring version) {
  81   if (version == NULL) {
  82     return NULL;
  83   }
  84   return java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(version));
  85 }
  86 
  87 static ModuleEntryTable* get_module_entry_table(Handle h_loader) {
  88   // This code can be called during start-up, before the classLoader's classLoader data got
  89   // created.  So, call register_loader() to make sure the classLoader data gets created.
  90   ClassLoaderData *loader_cld = SystemDictionary::register_loader(h_loader);
  91   return loader_cld->modules();
  92 }
  93 
  94 static PackageEntryTable* get_package_entry_table(Handle h_loader) {
  95   // This code can be called during start-up, before the classLoader's classLoader data got
  96   // created.  So, call register_loader() to make sure the classLoader data gets created.
  97   ClassLoaderData *loader_cld = SystemDictionary::register_loader(h_loader);
  98   return loader_cld->packages();
  99 }
 100 
 101 static ModuleEntry* get_module_entry(jobject module, TRAPS) {
 102   oop m = JNIHandles::resolve(module);
 103   if (!java_lang_Module::is_instance(m)) {
 104     THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(),
 105                    "module is not an instance of type java.lang.Module");
 106   }
 107   return java_lang_Module::module_entry(m);
 108 }
 109 
 110 static PackageEntry* get_package_entry(ModuleEntry* module_entry, const char* package_name, TRAPS) {
 111   ResourceMark rm(THREAD);
 112   if (package_name == NULL) return NULL;
 113   TempNewSymbol pkg_symbol = SymbolTable::new_symbol(package_name, CHECK_NULL);
 114   PackageEntryTable* package_entry_table = module_entry->loader_data()->packages();
 115   assert(package_entry_table != NULL, "Unexpected null package entry table");
 116   return package_entry_table->lookup_only(pkg_symbol);
 117 }
 118 
 119 static PackageEntry* get_package_entry_by_name(Symbol* package,
 120                                                Handle h_loader,
 121                                                TRAPS) {
 122   if (package != NULL) {
 123     ResourceMark rm(THREAD);
 124     if (Modules::verify_package_name(package->as_C_string())) {
 125       PackageEntryTable* const package_entry_table =
 126         get_package_entry_table(h_loader);
 127       assert(package_entry_table != NULL, "Unexpected null package entry table");
 128       return package_entry_table->lookup_only(package);
 129     }
 130   }
 131   return NULL;
 132 }
 133 
 134 bool Modules::is_package_defined(Symbol* package, Handle h_loader, TRAPS) {
 135   PackageEntry* res = get_package_entry_by_name(package, h_loader, CHECK_false);
 136   return res != NULL;
 137 }
 138 
 139 static void define_javabase_module(jobject module, jstring version,
 140                                    jstring location, const char* const* packages,
 141                                    jsize num_packages, TRAPS) {
 142   ResourceMark rm(THREAD);
 143 
 144   Handle module_handle(THREAD, JNIHandles::resolve(module));
 145 
 146   // Obtain java.base's module version


 168   GrowableArray<Symbol*>* pkg_list = new GrowableArray<Symbol*>(num_packages);
 169   for (int x = 0; x < num_packages; x++) {
 170     const char *package_name = packages[x];
 171     if (!Modules::verify_package_name(package_name)) {
 172       THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
 173                 err_msg("Invalid package name: %s for module: " JAVA_BASE_NAME, package_name));
 174     }
 175     Symbol* pkg_symbol = SymbolTable::new_symbol(package_name, CHECK);
 176     pkg_list->append(pkg_symbol);
 177   }
 178 
 179   // Validate java_base's loader is the boot loader.
 180   oop loader = java_lang_Module::loader(module_handle());
 181   if (loader != NULL) {
 182     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
 183               "Class loader must be the boot class loader");
 184   }
 185   Handle h_loader(THREAD, loader);
 186 
 187   // Ensure the boot loader's PackageEntryTable has been created
 188   PackageEntryTable* package_table = get_package_entry_table(h_loader);
 189   assert(pkg_list->length() == 0 || package_table != NULL, "Bad package_table");
 190 
 191   // Ensure java.base's ModuleEntry has been created
 192   assert(ModuleEntryTable::javabase_moduleEntry() != NULL, "No ModuleEntry for " JAVA_BASE_NAME);
 193 
 194   bool duplicate_javabase = false;
 195   {
 196     MutexLocker m1(Module_lock, THREAD);
 197 
 198     if (ModuleEntryTable::javabase_defined()) {
 199       duplicate_javabase = true;
 200     } else {
 201 
 202       // Verify that all java.base packages created during bootstrapping are in
 203       // pkg_list.  If any are not in pkg_list, than a non-java.base class was
 204       // loaded erroneously pre java.base module definition.
 205       package_table->verify_javabase_packages(pkg_list);
 206 
 207       // loop through and add any new packages for java.base
 208       PackageEntry* pkg;


 328         !SystemDictionary::is_platform_class_loader(h_loader()) &&
 329         (strncmp(package_name, JAVAPKG, JAVAPKG_LEN) == 0 &&
 330           (package_name[JAVAPKG_LEN] == '/' || package_name[JAVAPKG_LEN] == '\0'))) {
 331       const char* class_loader_name = SystemDictionary::loader_name(h_loader());
 332       size_t pkg_len = strlen(package_name);
 333       char* pkg_name = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, pkg_len);
 334       strncpy(pkg_name, package_name, pkg_len);
 335       StringUtils::replace_no_expand(pkg_name, "/", ".");
 336       const char* msg_text1 = "Class loader (instance of): ";
 337       const char* msg_text2 = " tried to define prohibited package name: ";
 338       size_t len = strlen(msg_text1) + strlen(class_loader_name) + strlen(msg_text2) + pkg_len + 1;
 339       char* message = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, len);
 340       jio_snprintf(message, len, "%s%s%s%s", msg_text1, class_loader_name, msg_text2, pkg_name);
 341       THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), message);
 342     }
 343 
 344     Symbol* pkg_symbol = SymbolTable::new_symbol(package_name, CHECK);
 345     pkg_list->append(pkg_symbol);
 346   }
 347 
 348   ModuleEntryTable* module_table = get_module_entry_table(h_loader);
 349   assert(module_table != NULL, "module entry table shouldn't be null");
 350 
 351   // Create symbol* entry for module name.
 352   TempNewSymbol module_symbol = SymbolTable::new_symbol(module_name, CHECK);
 353 
 354   bool dupl_modules = false;
 355 
 356   // Create symbol* entry for module version.
 357   TempNewSymbol version_symbol;
 358   if (module_version != NULL) {
 359     version_symbol = SymbolTable::new_symbol(module_version, CHECK);
 360   } else {
 361     version_symbol = NULL;
 362   }
 363 
 364   // Create symbol* entry for module location.
 365   const char* module_location = NULL;
 366   TempNewSymbol location_symbol = NULL;
 367   if (location != NULL) {
 368     module_location =
 369       java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(location));
 370     if (module_location != NULL) {
 371       location_symbol = SymbolTable::new_symbol(module_location, CHECK);
 372     }
 373   }
 374 
 375   ClassLoaderData* loader_data = ClassLoaderData::class_loader_data_or_null(h_loader());
 376   assert(loader_data != NULL, "class loader data shouldn't be null");
 377 
 378   PackageEntryTable* package_table = NULL;
 379   PackageEntry* existing_pkg = NULL;
 380   {
 381     MutexLocker ml(Module_lock, THREAD);
 382 
 383     if (num_packages > 0) {
 384       package_table = get_package_entry_table(h_loader);
 385       assert(package_table != NULL, "Missing package_table");
 386 
 387       // Check that none of the packages exist in the class loader's package table.
 388       for (int x = 0; x < pkg_list->length(); x++) {
 389         existing_pkg = package_table->lookup_only(pkg_list->at(x));
 390         if (existing_pkg != NULL) {
 391           // This could be because the module was already defined.  If so,
 392           // report that error instead of the package error.
 393           if (module_table->lookup_only(module_symbol) != NULL) {
 394             dupl_modules = true;
 395           }
 396           break;
 397         }
 398       }
 399     }  // if (num_packages > 0)...
 400 
 401     // Add the module and its packages.
 402     if (!dupl_modules && existing_pkg == NULL) {
 403       // Create the entry for this module in the class loader's module entry table.
 404       ModuleEntry* module_entry = module_table->locked_create_entry_or_null(module_handle,


< prev index next >