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 } |
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 } |
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 } |