hotspot/src/share/vm/classfile/modules.cpp
changeset 43466 add500644443
parent 43446 4f9ac7ab99d9
child 43471 bfb383279a16
equal deleted inserted replaced
43465:033b9f74b930 43466:add500644443
    37 #include "classfile/systemDictionary.hpp"
    37 #include "classfile/systemDictionary.hpp"
    38 #include "classfile/vmSymbols.hpp"
    38 #include "classfile/vmSymbols.hpp"
    39 #include "logging/log.hpp"
    39 #include "logging/log.hpp"
    40 #include "memory/resourceArea.hpp"
    40 #include "memory/resourceArea.hpp"
    41 #include "oops/instanceKlass.hpp"
    41 #include "oops/instanceKlass.hpp"
    42 #include "oops/objArrayKlass.hpp"
       
    43 #include "oops/objArrayOop.inline.hpp"
       
    44 #include "runtime/arguments.hpp"
    42 #include "runtime/arguments.hpp"
    45 #include "runtime/handles.inline.hpp"
    43 #include "runtime/handles.inline.hpp"
    46 #include "runtime/javaCalls.hpp"
    44 #include "runtime/javaCalls.hpp"
    47 #include "runtime/reflection.hpp"
    45 #include "runtime/reflection.hpp"
    48 #include "utilities/stringUtils.hpp"
    46 #include "utilities/stringUtils.hpp"
    49 #include "utilities/utf8.hpp"
    47 #include "utilities/utf8.hpp"
    50 
    48 
    51 static bool verify_module_name(char *module_name) {
    49 static bool verify_module_name(const char *module_name) {
    52   if (module_name == NULL) return false;
    50   if (module_name == NULL) return false;
    53   int len = (int)strlen(module_name);
    51   int len = (int)strlen(module_name);
    54   return (len > 0 && len <= Symbol::max_length());
    52   return (len > 0 && len <= Symbol::max_length());
    55 }
    53 }
    56 
    54 
    57 bool Modules::verify_package_name(char *package_name) {
    55 bool Modules::verify_package_name(const char* package_name) {
    58   if (package_name == NULL) return false;
    56   if (package_name == NULL) return false;
    59   int len = (int)strlen(package_name);
    57   int len = (int)strlen(package_name);
    60   return (len > 0 && len <= Symbol::max_length() &&
    58   return (len > 0 && len <= Symbol::max_length() &&
    61     UTF8::is_legal_utf8((unsigned char *)package_name, len, false) &&
    59     UTF8::is_legal_utf8((const unsigned char *)package_name, len, false) &&
    62     ClassFileParser::verify_unqualified_name(package_name, len,
    60     ClassFileParser::verify_unqualified_name(package_name, len,
    63     ClassFileParser::LegalClass));
    61     ClassFileParser::LegalClass));
    64 }
    62 }
    65 
    63 
    66 static char* get_module_name(oop module, TRAPS) {
    64 static char* get_module_name(oop module, TRAPS) {
   105                    "module is not an instance of type java.lang.reflect.Module");
   103                    "module is not an instance of type java.lang.reflect.Module");
   106   }
   104   }
   107   return java_lang_reflect_Module::module_entry(module_h(), CHECK_NULL);
   105   return java_lang_reflect_Module::module_entry(module_h(), CHECK_NULL);
   108 }
   106 }
   109 
   107 
   110 static PackageEntry* get_package_entry(ModuleEntry* module_entry, jstring package, TRAPS) {
   108 static PackageEntry* get_package_entry(ModuleEntry* module_entry, const char* package_name, TRAPS) {
   111   ResourceMark rm(THREAD);
   109   ResourceMark rm(THREAD);
   112   if (package == NULL) return NULL;
       
   113   const char *package_name = java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(package));
       
   114   if (package_name == NULL) return NULL;
   110   if (package_name == NULL) return NULL;
   115   TempNewSymbol pkg_symbol = SymbolTable::new_symbol(package_name, CHECK_NULL);
   111   TempNewSymbol pkg_symbol = SymbolTable::new_symbol(package_name, CHECK_NULL);
   116   PackageEntryTable* package_entry_table = module_entry->loader_data()->packages();
   112   PackageEntryTable* package_entry_table = module_entry->loader_data()->packages();
   117   assert(package_entry_table != NULL, "Unexpected null package entry table");
   113   assert(package_entry_table != NULL, "Unexpected null package entry table");
   118   return package_entry_table->lookup_only(pkg_symbol);
   114   return package_entry_table->lookup_only(pkg_symbol);
   137   PackageEntry* res = get_package_entry_by_name(package, h_loader, CHECK_false);
   133   PackageEntry* res = get_package_entry_by_name(package, h_loader, CHECK_false);
   138   return res != NULL;
   134   return res != NULL;
   139 }
   135 }
   140 
   136 
   141 static void define_javabase_module(jobject module, jstring version,
   137 static void define_javabase_module(jobject module, jstring version,
   142                                    jstring location, jobjectArray packages, TRAPS) {
   138                                    jstring location, const char* const* packages,
       
   139                                    jsize num_packages, TRAPS) {
   143   ResourceMark rm(THREAD);
   140   ResourceMark rm(THREAD);
   144 
   141 
   145   Handle module_handle(THREAD, JNIHandles::resolve(module));
   142   Handle module_handle(THREAD, JNIHandles::resolve(module));
   146 
   143 
   147   // Obtain java.base's module version
   144   // Obtain java.base's module version
   162     if (module_location != NULL) {
   159     if (module_location != NULL) {
   163       location_symbol = SymbolTable::new_symbol(module_location, CHECK);
   160       location_symbol = SymbolTable::new_symbol(module_location, CHECK);
   164     }
   161     }
   165   }
   162   }
   166 
   163 
   167   objArrayOop packages_oop = objArrayOop(JNIHandles::resolve(packages));
       
   168   objArrayHandle packages_h(THREAD, packages_oop);
       
   169   int num_packages = (packages_h == NULL ? 0 : packages_h->length());
       
   170 
   164 
   171   // Check that the list of packages has no duplicates and that the
   165   // Check that the list of packages has no duplicates and that the
   172   // packages are syntactically ok.
   166   // packages are syntactically ok.
   173   GrowableArray<Symbol*>* pkg_list = new GrowableArray<Symbol*>(num_packages);
   167   GrowableArray<Symbol*>* pkg_list = new GrowableArray<Symbol*>(num_packages);
   174   for (int x = 0; x < num_packages; x++) {
   168   for (int x = 0; x < num_packages; x++) {
   175     oop string_obj = packages_h->obj_at(x);
   169     const char *package_name = packages[x];
   176 
       
   177     if (string_obj == NULL || !string_obj->is_a(SystemDictionary::String_klass())) {
       
   178       THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
       
   179                 "Bad package name for module: " JAVA_BASE_NAME);
       
   180     }
       
   181     char *package_name = java_lang_String::as_utf8_string(string_obj);
       
   182     if (!Modules::verify_package_name(package_name)) {
   170     if (!Modules::verify_package_name(package_name)) {
   183       THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
   171       THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
   184                 err_msg("Invalid package name: %s for module: " JAVA_BASE_NAME, package_name));
   172                 err_msg("Invalid package name: %s for module: " JAVA_BASE_NAME, package_name));
   185     }
   173     }
   186     Symbol* pkg_symbol = SymbolTable::new_symbol(package_name, CHECK);
   174     Symbol* pkg_symbol = SymbolTable::new_symbol(package_name, CHECK);
   275               package_name, module_name));
   263               package_name, module_name));
   276   }
   264   }
   277 }
   265 }
   278 
   266 
   279 void Modules::define_module(jobject module, jstring version,
   267 void Modules::define_module(jobject module, jstring version,
   280                             jstring location, jobjectArray packages, TRAPS) {
   268                             jstring location, const char* const* packages,
       
   269                             jsize num_packages, TRAPS) {
   281   ResourceMark rm(THREAD);
   270   ResourceMark rm(THREAD);
   282 
   271 
   283   if (module == NULL) {
   272   if (module == NULL) {
   284     THROW_MSG(vmSymbols::java_lang_NullPointerException(), "Null module object");
   273     THROW_MSG(vmSymbols::java_lang_NullPointerException(), "Null module object");
   285   }
   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));
   286   Handle module_handle(THREAD, JNIHandles::resolve(module));
   287   if (!java_lang_reflect_Module::is_instance(module_handle())) {
   287   if (!java_lang_reflect_Module::is_instance(module_handle())) {
   288     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
   288     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
   289               "module is not an instance of type java.lang.reflect.Module");
   289               "module is not an instance of type java.lang.reflect.Module");
   290   }
   290   }
   295               "Module name cannot be null");
   295               "Module name cannot be null");
   296   }
   296   }
   297 
   297 
   298   // Special handling of java.base definition
   298   // Special handling of java.base definition
   299   if (strcmp(module_name, JAVA_BASE_NAME) == 0) {
   299   if (strcmp(module_name, JAVA_BASE_NAME) == 0) {
   300     define_javabase_module(module, version, location, packages, CHECK);
   300     define_javabase_module(module, version, location, packages, num_packages, CHECK);
   301     return;
   301     return;
   302   }
   302   }
   303 
   303 
   304   const char* module_version = get_module_version(version);
   304   const char* module_version = get_module_version(version);
   305 
   305 
   308   if (loader != java_lang_ClassLoader::non_reflection_class_loader(loader)) {
   308   if (loader != java_lang_ClassLoader::non_reflection_class_loader(loader)) {
   309     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
   309     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
   310               "Class loader is an invalid delegating class loader");
   310               "Class loader is an invalid delegating class loader");
   311   }
   311   }
   312   Handle h_loader = Handle(THREAD, loader);
   312   Handle h_loader = Handle(THREAD, loader);
   313 
       
   314   objArrayOop packages_oop = objArrayOop(JNIHandles::resolve(packages));
       
   315   objArrayHandle packages_h(THREAD, packages_oop);
       
   316   int num_packages = (packages_h == NULL ? 0 : packages_h->length());
       
   317 
   313 
   318   // Check that the list of packages has no duplicates and that the
   314   // Check that the list of packages has no duplicates and that the
   319   // packages are syntactically ok.
   315   // packages are syntactically ok.
   320   GrowableArray<Symbol*>* pkg_list = new GrowableArray<Symbol*>(num_packages);
   316   GrowableArray<Symbol*>* pkg_list = new GrowableArray<Symbol*>(num_packages);
   321   for (int x = 0; x < num_packages; x++) {
   317   for (int x = 0; x < num_packages; x++) {
   322     oop string_obj = packages_h->obj_at(x);
   318     const char* package_name = packages[x];
   323 
       
   324     if (string_obj == NULL || !string_obj->is_a(SystemDictionary::String_klass())) {
       
   325       THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
       
   326                 err_msg("Bad package name for module: %s", module_name));
       
   327     }
       
   328     char *package_name = java_lang_String::as_utf8_string(string_obj);
       
   329     if (!verify_package_name(package_name)) {
   319     if (!verify_package_name(package_name)) {
   330       THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
   320       THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
   331                 err_msg("Invalid package name: %s for module: %s",
   321                 err_msg("Invalid package name: %s for module: %s",
   332                         package_name, module_name));
   322                         package_name, module_name));
   333     }
   323     }
   335     // Only modules defined to either the boot or platform class loader, can define a "java/" package.
   325     // Only modules defined to either the boot or platform class loader, can define a "java/" package.
   336     if (!h_loader.is_null() &&
   326     if (!h_loader.is_null() &&
   337         !SystemDictionary::is_platform_class_loader(h_loader) &&
   327         !SystemDictionary::is_platform_class_loader(h_loader) &&
   338         strncmp(package_name, JAVAPKG, JAVAPKG_LEN) == 0) {
   328         strncmp(package_name, JAVAPKG, JAVAPKG_LEN) == 0) {
   339       const char* class_loader_name = SystemDictionary::loader_name(h_loader());
   329       const char* class_loader_name = SystemDictionary::loader_name(h_loader());
   340       StringUtils::replace_no_expand(package_name, "/", ".");
   330       size_t pkg_len = strlen(package_name);
       
   331       char* pkg_name = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, pkg_len);
       
   332       strncpy(pkg_name, package_name, pkg_len);
       
   333       StringUtils::replace_no_expand(pkg_name, "/", ".");
   341       const char* msg_text1 = "Class loader (instance of): ";
   334       const char* msg_text1 = "Class loader (instance of): ";
   342       const char* msg_text2 = " tried to define prohibited package name: ";
   335       const char* msg_text2 = " tried to define prohibited package name: ";
   343       size_t len = strlen(msg_text1) + strlen(class_loader_name) + strlen(msg_text2) + strlen(package_name) + 1;
   336       size_t len = strlen(msg_text1) + strlen(class_loader_name) + strlen(msg_text2) + pkg_len + 1;
   344       char* message = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, len);
   337       char* message = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, len);
   345       jio_snprintf(message, len, "%s%s%s%s", msg_text1, class_loader_name, msg_text2, package_name);
   338       jio_snprintf(message, len, "%s%s%s%s", msg_text1, class_loader_name, msg_text2, pkg_name);
   346       THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), message);
   339       THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), message);
   347     }
   340     }
   348 
   341 
   349     Symbol* pkg_symbol = SymbolTable::new_symbol(package_name, CHECK);
   342     Symbol* pkg_symbol = SymbolTable::new_symbol(package_name, CHECK);
   350     // append_if_missing() returns FALSE if entry already exists.
   343     // append_if_missing() returns FALSE if entry already exists.
   504   unnamed_module->set_module(ClassLoaderData::the_null_class_loader_data()->add_handle(module_handle));
   497   unnamed_module->set_module(ClassLoaderData::the_null_class_loader_data()->add_handle(module_handle));
   505   // Store pointer to the ModuleEntry in the unnamed module's java.lang.reflect.Module object.
   498   // Store pointer to the ModuleEntry in the unnamed module's java.lang.reflect.Module object.
   506   java_lang_reflect_Module::set_module_entry(module_handle(), unnamed_module);
   499   java_lang_reflect_Module::set_module_entry(module_handle(), unnamed_module);
   507 }
   500 }
   508 
   501 
   509 void Modules::add_module_exports(jobject from_module, jstring package, jobject to_module, TRAPS) {
   502 void Modules::add_module_exports(jobject from_module, const char* package_name, jobject to_module, TRAPS) {
   510   if (package == NULL) {
   503   if (package_name == NULL) {
   511     THROW_MSG(vmSymbols::java_lang_NullPointerException(),
   504     THROW_MSG(vmSymbols::java_lang_NullPointerException(),
   512               "package is null");
   505               "package is null");
   513   }
   506   }
   514   if (from_module == NULL) {
   507   if (from_module == NULL) {
   515     THROW_MSG(vmSymbols::java_lang_NullPointerException(),
   508     THROW_MSG(vmSymbols::java_lang_NullPointerException(),
   533       THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
   526       THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
   534                 "to_module is invalid");
   527                 "to_module is invalid");
   535     }
   528     }
   536   }
   529   }
   537 
   530 
   538   PackageEntry *package_entry = get_package_entry(from_module_entry, package, CHECK);
   531   PackageEntry *package_entry = get_package_entry(from_module_entry, package_name, CHECK);
   539   ResourceMark rm(THREAD);
   532   ResourceMark rm(THREAD);
   540   if (package_entry == NULL) {
   533   if (package_entry == NULL) {
   541     const char *package_name = java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(package));
       
   542     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
   534     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
   543               err_msg("Package %s not found in from_module %s",
   535               err_msg("Package %s not found in from_module %s",
   544                       package_name != NULL ? package_name : "",
   536                       package_name != NULL ? package_name : "",
   545                       from_module_entry->name()->as_C_string()));
   537                       from_module_entry->name()->as_C_string()));
   546   }
   538   }
   564     package_entry->set_exported(to_module_entry);
   556     package_entry->set_exported(to_module_entry);
   565   }
   557   }
   566 }
   558 }
   567 
   559 
   568 
   560 
   569 void Modules::add_module_exports_qualified(jobject from_module, jstring package,
   561 void Modules::add_module_exports_qualified(jobject from_module, const char* package,
   570                                            jobject to_module, TRAPS) {
   562                                            jobject to_module, TRAPS) {
   571   if (to_module == NULL) {
   563   if (to_module == NULL) {
   572     THROW_MSG(vmSymbols::java_lang_NullPointerException(),
   564     THROW_MSG(vmSymbols::java_lang_NullPointerException(),
   573               "to_module is null");
   565               "to_module is null");
   574   }
   566   }
   656 
   648 
   657   return JNIHandles::make_local(THREAD, module);
   649   return JNIHandles::make_local(THREAD, module);
   658 }
   650 }
   659 
   651 
   660 
   652 
   661 jobject Modules::get_module_by_package_name(jobject loader, jstring package, TRAPS) {
   653 jobject Modules::get_module_by_package_name(jobject loader, const char* package_name, TRAPS) {
   662   ResourceMark rm(THREAD);
   654   ResourceMark rm(THREAD);
   663   assert(ModuleEntryTable::javabase_defined(),
   655   assert(ModuleEntryTable::javabase_defined(),
   664          "Attempt to call get_module_from_pkg before " JAVA_BASE_NAME " is defined");
   656          "Attempt to call get_module_from_pkg before " JAVA_BASE_NAME " is defined");
   665 
   657 
   666   if (NULL == package) {
   658   if (package_name == NULL) {
   667     THROW_MSG_(vmSymbols::java_lang_NullPointerException(),
   659     THROW_MSG_(vmSymbols::java_lang_NullPointerException(),
   668                "package is null", JNI_FALSE);
   660                "package is null", JNI_FALSE);
   669   }
       
   670   const char* package_str =
       
   671     java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(package));
       
   672   if (NULL == package_str) {
       
   673     THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(),
       
   674                "Invalid package", JNI_FALSE);
       
   675   }
   661   }
   676 
   662 
   677   Handle h_loader (THREAD, JNIHandles::resolve(loader));
   663   Handle h_loader (THREAD, JNIHandles::resolve(loader));
   678   // Check that loader is a subclass of java.lang.ClassLoader.
   664   // Check that loader is a subclass of java.lang.ClassLoader.
   679   if (loader != NULL && !java_lang_ClassLoader::is_subclass(h_loader->klass())) {
   665   if (loader != NULL && !java_lang_ClassLoader::is_subclass(h_loader->klass())) {
   680     THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(),
   666     THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(),
   681                "Class loader is not a subclass of java.lang.ClassLoader", JNI_FALSE);
   667                "Class loader is not a subclass of java.lang.ClassLoader", JNI_FALSE);
   682   }
   668   }
   683 
   669 
   684   if (strlen(package_str) == 0) {
   670   if (strlen(package_name) == 0) {
   685     // Return the unnamed module
   671     // Return the unnamed module
   686     ModuleEntryTable* module_table = get_module_entry_table(h_loader, CHECK_NULL);
   672     ModuleEntryTable* module_table = get_module_entry_table(h_loader, CHECK_NULL);
   687     if (NULL == module_table) return NULL;
   673     if (NULL == module_table) return NULL;
   688     const ModuleEntry* const unnamed_module = module_table->unnamed_module();
   674     const ModuleEntry* const unnamed_module = module_table->unnamed_module();
   689     return JNIHandles::make_local(THREAD, JNIHandles::resolve(unnamed_module->module()));
   675     return JNIHandles::make_local(THREAD, JNIHandles::resolve(unnamed_module->module()));
   690 
   676 
   691   } else {
   677   } else {
   692     TempNewSymbol package_sym = SymbolTable::new_symbol(package_str, CHECK_NULL);
   678     TempNewSymbol package_sym = SymbolTable::new_symbol(package_name, CHECK_NULL);
   693     return get_module(package_sym, h_loader, CHECK_NULL);
   679     return get_module(package_sym, h_loader, CHECK_NULL);
   694   }
   680   }
   695   return NULL;
   681   return NULL;
   696 }
   682 }
   697 
   683 
   698 
   684 
   699 jobject Modules::get_named_module(Handle h_loader, const char* package_str, TRAPS) {
   685 jobject Modules::get_named_module(Handle h_loader, const char* package_name, TRAPS) {
   700   assert(ModuleEntryTable::javabase_defined(),
   686   assert(ModuleEntryTable::javabase_defined(),
   701          "Attempt to call get_named_module before " JAVA_BASE_NAME " is defined");
   687          "Attempt to call get_named_module before " JAVA_BASE_NAME " is defined");
   702   assert(h_loader.is_null() || java_lang_ClassLoader::is_subclass(h_loader->klass()),
   688   assert(h_loader.is_null() || java_lang_ClassLoader::is_subclass(h_loader->klass()),
   703          "Class loader is not a subclass of java.lang.ClassLoader");
   689          "Class loader is not a subclass of java.lang.ClassLoader");
   704   assert(package_str != NULL, "the package_str should not be NULL");
   690   assert(package_name != NULL, "the package_name should not be NULL");
   705 
   691 
   706   if (strlen(package_str) == 0) {
   692   if (strlen(package_name) == 0) {
   707     return NULL;
   693     return NULL;
   708   }
   694   }
   709   TempNewSymbol package_sym = SymbolTable::new_symbol(package_str, CHECK_NULL);
   695   TempNewSymbol package_sym = SymbolTable::new_symbol(package_name, CHECK_NULL);
   710   const PackageEntry* const pkg_entry =
   696   const PackageEntry* const pkg_entry =
   711     get_package_entry_by_name(package_sym, h_loader, THREAD);
   697     get_package_entry_by_name(package_sym, h_loader, THREAD);
   712   const ModuleEntry* const module_entry = (pkg_entry != NULL ? pkg_entry->module() : NULL);
   698   const ModuleEntry* const module_entry = (pkg_entry != NULL ? pkg_entry->module() : NULL);
   713 
   699 
   714   if (module_entry != NULL && module_entry->module() != NULL && module_entry->is_named()) {
   700   if (module_entry != NULL && module_entry->module() != NULL && module_entry->is_named()) {
   730   }
   716   }
   731 
   717 
   732   return NULL;
   718   return NULL;
   733 }
   719 }
   734 
   720 
   735 void Modules::add_module_package(jobject module, jstring package, TRAPS) {
   721 void Modules::add_module_package(jobject module, const char* package_name, TRAPS) {
   736   ResourceMark rm(THREAD);
   722   ResourceMark rm(THREAD);
   737 
   723 
   738   if (module == NULL) {
   724   if (module == NULL) {
   739     THROW_MSG(vmSymbols::java_lang_NullPointerException(),
   725     THROW_MSG(vmSymbols::java_lang_NullPointerException(),
   740               "module is null");
   726               "module is null");
   741   }
   727   }
   742   if (package == NULL) {
   728   if (package_name == NULL) {
   743     THROW_MSG(vmSymbols::java_lang_NullPointerException(),
   729     THROW_MSG(vmSymbols::java_lang_NullPointerException(),
   744               "package is null");
   730               "package is null");
   745   }
   731   }
   746   ModuleEntry* module_entry = get_module_entry(module, CHECK);
   732   ModuleEntry* module_entry = get_module_entry(module, CHECK);
   747   if (module_entry == NULL) {
   733   if (module_entry == NULL) {
   749               "module is invalid");
   735               "module is invalid");
   750   }
   736   }
   751   if (!module_entry->is_named()) {
   737   if (!module_entry->is_named()) {
   752     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
   738     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
   753               "module cannot be an unnamed module");
   739               "module cannot be an unnamed module");
   754   }
       
   755   char *package_name = java_lang_String::as_utf8_string(
       
   756     JNIHandles::resolve_non_null(package));
       
   757   if (package_name == NULL) {
       
   758     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "Bad package");
       
   759   }
   740   }
   760   if (!verify_package_name(package_name)) {
   741   if (!verify_package_name(package_name)) {
   761     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
   742     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
   762               err_msg("Invalid package name: %s", package_name));
   743               err_msg("Invalid package name: %s", package_name));
   763   }
   744   }
   767   // Only modules defined to either the boot or platform class loader, can define a "java/" package.
   748   // Only modules defined to either the boot or platform class loader, can define a "java/" package.
   768   if (!loader_data->is_the_null_class_loader_data() &&
   749   if (!loader_data->is_the_null_class_loader_data() &&
   769       !loader_data->is_platform_class_loader_data() &&
   750       !loader_data->is_platform_class_loader_data() &&
   770       strncmp(package_name, JAVAPKG, JAVAPKG_LEN) == 0) {
   751       strncmp(package_name, JAVAPKG, JAVAPKG_LEN) == 0) {
   771     const char* class_loader_name = SystemDictionary::loader_name(loader_data);
   752     const char* class_loader_name = SystemDictionary::loader_name(loader_data);
   772     StringUtils::replace_no_expand(package_name, "/", ".");
   753     size_t pkg_len = strlen(package_name);
       
   754     char* pkg_name = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, pkg_len);
       
   755     strncpy(pkg_name, package_name, pkg_len);
       
   756     StringUtils::replace_no_expand(pkg_name, "/", ".");
   773     const char* msg_text1 = "Class loader (instance of): ";
   757     const char* msg_text1 = "Class loader (instance of): ";
   774     const char* msg_text2 = " tried to define prohibited package name: ";
   758     const char* msg_text2 = " tried to define prohibited package name: ";
   775     size_t len = strlen(msg_text1) + strlen(class_loader_name) + strlen(msg_text2) + strlen(package_name) + 1;
   759     size_t len = strlen(msg_text1) + strlen(class_loader_name) + strlen(msg_text2) + pkg_len + 1;
   776     char* message = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, len);
   760     char* message = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, len);
   777     jio_snprintf(message, len, "%s%s%s%s", msg_text1, class_loader_name, msg_text2, package_name);
   761     jio_snprintf(message, len, "%s%s%s%s", msg_text1, class_loader_name, msg_text2, pkg_name);
   778     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), message);
   762     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), message);
   779   }
   763   }
   780 
   764 
   781   log_debug(modules)("add_module_package(): Adding package %s to module %s",
   765   log_debug(modules)("add_module_package(): Adding package %s to module %s",
   782                      package_name, module_entry->name()->as_C_string());
   766                      package_name, module_entry->name()->as_C_string());
   800     throw_dup_pkg_exception(module_entry->name()->as_C_string(), existing_pkg, CHECK);
   784     throw_dup_pkg_exception(module_entry->name()->as_C_string(), existing_pkg, CHECK);
   801   }
   785   }
   802 }
   786 }
   803 
   787 
   804 // Export package in module to all unnamed modules.
   788 // Export package in module to all unnamed modules.
   805 void Modules::add_module_exports_to_all_unnamed(jobject module, jstring package, TRAPS) {
   789 void Modules::add_module_exports_to_all_unnamed(jobject module, const char* package_name, TRAPS) {
   806   if (module == NULL) {
   790   if (module == NULL) {
   807     THROW_MSG(vmSymbols::java_lang_NullPointerException(),
   791     THROW_MSG(vmSymbols::java_lang_NullPointerException(),
   808               "module is null");
   792               "module is null");
   809   }
   793   }
   810   if (package == NULL) {
   794   if (package_name == NULL) {
   811     THROW_MSG(vmSymbols::java_lang_NullPointerException(),
   795     THROW_MSG(vmSymbols::java_lang_NullPointerException(),
   812               "package is null");
   796               "package is null");
   813   }
   797   }
   814   ModuleEntry* module_entry = get_module_entry(module, CHECK);
   798   ModuleEntry* module_entry = get_module_entry(module, CHECK);
   815   if (module_entry == NULL) {
   799   if (module_entry == NULL) {
   816     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
   800     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
   817               "module is invalid");
   801               "module is invalid");
   818   }
   802   }
   819 
   803 
   820   if (module_entry->is_named()) { // No-op for unnamed module.
   804   if (module_entry->is_named()) { // No-op for unnamed module.
   821     PackageEntry *package_entry = get_package_entry(module_entry, package, CHECK);
   805     PackageEntry *package_entry = get_package_entry(module_entry, package_name, CHECK);
   822     ResourceMark rm(THREAD);
   806     ResourceMark rm(THREAD);
   823     if (package_entry == NULL) {
   807     if (package_entry == NULL) {
   824       const char *package_name = java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(package));
       
   825       THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
   808       THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
   826                 err_msg("Package %s not found in module %s",
   809                 err_msg("Package %s not found in module %s",
   827                         package_name != NULL ? package_name : "",
   810                         package_name != NULL ? package_name : "",
   828                         module_entry->name()->as_C_string()));
   811                         module_entry->name()->as_C_string()));
   829     }
   812     }