< prev index next >

src/hotspot/share/classfile/modules.cpp

Print this page

 141 
 142 // Converts the String oop to an internal package
 143 // Will use the provided buffer if it's sufficiently large, otherwise allocates
 144 // a resource array
 145 // The length of the resulting string will be assigned to utf8_len
 146 static const char* as_internal_package(oop package_string, char* buf, size_t buflen, int& utf8_len) {
 147   size_t full_utf8_len;
 148   char* package_name = java_lang_String::as_utf8_string_full(package_string, buf, buflen, full_utf8_len);
 149   utf8_len = checked_cast<int>(full_utf8_len); // package names are < 64K
 150 
 151   // Turn all '/'s into '.'s
 152   for (int index = 0; index < utf8_len; index++) {
 153     if (package_name[index] == JVM_SIGNATURE_DOT) {
 154       package_name[index] = JVM_SIGNATURE_SLASH;
 155     }
 156   }
 157   return package_name;
 158 }
 159 
 160 static void define_javabase_module(Handle module_handle, jstring version, jstring location,
 161                                    objArrayHandle pkgs, int num_packages, TRAPS) {
 162   ResourceMark rm(THREAD);
 163 
 164   // Obtain java.base's module version
 165   TempNewSymbol version_symbol = as_symbol(version);
 166 
 167   // Obtain java.base's location
 168   TempNewSymbol location_symbol = as_symbol(location);
 169 
 170   // Check that the packages are syntactically ok.
 171   char buf[128];
 172   GrowableArray<Symbol*>* pkg_list = new GrowableArray<Symbol*>(num_packages);
 173   for (int x = 0; x < num_packages; x++) {
 174     oop pkg_str = pkgs->obj_at(x);
 175 
 176     if (pkg_str == nullptr || pkg_str->klass() != vmClasses::String_klass()) {
 177       THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
 178                 err_msg("Bad package name"));
 179     }
 180 
 181     int package_len;

 280   check_cds_restrictions(CHECK);
 281   ResourceMark rm(THREAD);
 282 
 283   if (module.is_null()) {
 284     THROW_MSG(vmSymbols::java_lang_NullPointerException(), "Null module object");
 285   }
 286 
 287   if (!java_lang_Module::is_instance(module())) {
 288     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
 289               "module is not an instance of type java.lang.Module");
 290   }
 291 
 292   int module_name_len;
 293   char* module_name = get_module_name(module(), module_name_len, CHECK);
 294   if (module_name == nullptr) {
 295     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
 296               "Module name cannot be null");
 297   }
 298 
 299   // Resolve packages
 300   objArrayHandle packages_h(THREAD, objArrayOop(JNIHandles::resolve(packages)));
 301   int num_packages = (packages_h.is_null() ? 0 : packages_h->length());
 302 
 303   // Special handling of java.base definition
 304   if (strcmp(module_name, JAVA_BASE_NAME) == 0) {
 305     assert(is_open == JNI_FALSE, "java.base module cannot be open");
 306     define_javabase_module(module, version, location, packages_h, num_packages, CHECK);
 307     return;
 308   }
 309 
 310   oop loader = java_lang_Module::loader(module());
 311   Handle h_loader = Handle(THREAD, loader);
 312   // define_module can be called during start-up, before the class loader's ClassLoaderData
 313   // has been created.  SystemDictionary::register_loader ensures creation, if needed.
 314   ClassLoaderData* loader_data = SystemDictionary::register_loader(h_loader);
 315   assert(loader_data != nullptr, "class loader data shouldn't be null");
 316 
 317   // Only modules defined to either the boot or platform class loader, can define a "java/" package.
 318   bool java_pkg_disallowed = !h_loader.is_null() &&
 319         !SystemDictionary::is_platform_class_loader(h_loader());
 320 

 141 
 142 // Converts the String oop to an internal package
 143 // Will use the provided buffer if it's sufficiently large, otherwise allocates
 144 // a resource array
 145 // The length of the resulting string will be assigned to utf8_len
 146 static const char* as_internal_package(oop package_string, char* buf, size_t buflen, int& utf8_len) {
 147   size_t full_utf8_len;
 148   char* package_name = java_lang_String::as_utf8_string_full(package_string, buf, buflen, full_utf8_len);
 149   utf8_len = checked_cast<int>(full_utf8_len); // package names are < 64K
 150 
 151   // Turn all '/'s into '.'s
 152   for (int index = 0; index < utf8_len; index++) {
 153     if (package_name[index] == JVM_SIGNATURE_DOT) {
 154       package_name[index] = JVM_SIGNATURE_SLASH;
 155     }
 156   }
 157   return package_name;
 158 }
 159 
 160 static void define_javabase_module(Handle module_handle, jstring version, jstring location,
 161                                    refArrayHandle pkgs, int num_packages, TRAPS) {
 162   ResourceMark rm(THREAD);
 163 
 164   // Obtain java.base's module version
 165   TempNewSymbol version_symbol = as_symbol(version);
 166 
 167   // Obtain java.base's location
 168   TempNewSymbol location_symbol = as_symbol(location);
 169 
 170   // Check that the packages are syntactically ok.
 171   char buf[128];
 172   GrowableArray<Symbol*>* pkg_list = new GrowableArray<Symbol*>(num_packages);
 173   for (int x = 0; x < num_packages; x++) {
 174     oop pkg_str = pkgs->obj_at(x);
 175 
 176     if (pkg_str == nullptr || pkg_str->klass() != vmClasses::String_klass()) {
 177       THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
 178                 err_msg("Bad package name"));
 179     }
 180 
 181     int package_len;

 280   check_cds_restrictions(CHECK);
 281   ResourceMark rm(THREAD);
 282 
 283   if (module.is_null()) {
 284     THROW_MSG(vmSymbols::java_lang_NullPointerException(), "Null module object");
 285   }
 286 
 287   if (!java_lang_Module::is_instance(module())) {
 288     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
 289               "module is not an instance of type java.lang.Module");
 290   }
 291 
 292   int module_name_len;
 293   char* module_name = get_module_name(module(), module_name_len, CHECK);
 294   if (module_name == nullptr) {
 295     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
 296               "Module name cannot be null");
 297   }
 298 
 299   // Resolve packages
 300   refArrayHandle packages_h(THREAD, refArrayOop(JNIHandles::resolve(packages)));
 301   int num_packages = (packages_h.is_null() ? 0 : packages_h->length());
 302 
 303   // Special handling of java.base definition
 304   if (strcmp(module_name, JAVA_BASE_NAME) == 0) {
 305     assert(is_open == JNI_FALSE, "java.base module cannot be open");
 306     define_javabase_module(module, version, location, packages_h, num_packages, CHECK);
 307     return;
 308   }
 309 
 310   oop loader = java_lang_Module::loader(module());
 311   Handle h_loader = Handle(THREAD, loader);
 312   // define_module can be called during start-up, before the class loader's ClassLoaderData
 313   // has been created.  SystemDictionary::register_loader ensures creation, if needed.
 314   ClassLoaderData* loader_data = SystemDictionary::register_loader(h_loader);
 315   assert(loader_data != nullptr, "class loader data shouldn't be null");
 316 
 317   // Only modules defined to either the boot or platform class loader, can define a "java/" package.
 318   bool java_pkg_disallowed = !h_loader.is_null() &&
 319         !SystemDictionary::is_platform_class_loader(h_loader());
 320 
< prev index next >