< prev index next >

src/hotspot/share/classfile/classLoader.cpp

Print this page
rev 58452 : imported patch pkg_name_from_class

@@ -174,80 +174,18 @@
     return false;
   }
   return (strncmp(str + (str_len - str_to_find_len), str_to_find, str_to_find_len) == 0);
 }
 
-// Used to obtain the package name from a fully qualified class name.
-// It is the responsibility of the caller to establish a ResourceMark.
-const char* ClassLoader::package_from_name(const char* const class_name, bool* bad_class_name) {
-  if (class_name == NULL) {
-    if (bad_class_name != NULL) {
-      *bad_class_name = true;
-    }
-    return NULL;
-  }
-
-  if (bad_class_name != NULL) {
-    *bad_class_name = false;
-  }
-
-  const char* const last_slash = strrchr(class_name, JVM_SIGNATURE_SLASH);
-  if (last_slash == NULL) {
-    // No package name
-    return NULL;
-  }
-
-  char* class_name_ptr = (char*) class_name;
-  // Skip over '['s
-  if (*class_name_ptr == JVM_SIGNATURE_ARRAY) {
-    do {
-      class_name_ptr++;
-    } while (*class_name_ptr == JVM_SIGNATURE_ARRAY);
-
-    // Fully qualified class names should not contain a 'L'.
-    // Set bad_class_name to true to indicate that the package name
-    // could not be obtained due to an error condition.
-    // In this situation, is_same_class_package returns false.
-    if (*class_name_ptr == JVM_SIGNATURE_CLASS) {
-      if (bad_class_name != NULL) {
-        *bad_class_name = true;
-      }
-      return NULL;
-    }
-  }
-
-  int length = last_slash - class_name_ptr;
-
-  // A class name could have just the slash character in the name.
-  if (length <= 0) {
-    // No package name
-    if (bad_class_name != NULL) {
-      *bad_class_name = true;
-    }
-    return NULL;
-  }
-
-  // drop name after last slash (including slash)
-  // Ex., "java/lang/String.class" => "java/lang"
-  char* pkg_name = NEW_RESOURCE_ARRAY(char, length + 1);
-  strncpy(pkg_name, class_name_ptr, length);
-  *(pkg_name+length) = '\0';
-
-  return (const char *)pkg_name;
-}
-
 // Given a fully qualified class name, find its defining package in the class loader's
 // package entry table.
-PackageEntry* ClassLoader::get_package_entry(const char* class_name, ClassLoaderData* loader_data, TRAPS) {
-  ResourceMark rm(THREAD);
-  const char *pkg_name = ClassLoader::package_from_name(class_name);
+PackageEntry* ClassLoader::get_package_entry(Symbol* pkg_name, ClassLoaderData* loader_data, TRAPS) {
   if (pkg_name == NULL) {
     return NULL;
   }
   PackageEntryTable* pkgEntryTable = loader_data->packages();
-  TempNewSymbol pkg_symbol = SymbolTable::new_symbol(pkg_name);
-  return pkgEntryTable->lookup_only(pkg_symbol);
+  return pkgEntryTable->lookup_only(pkg_name);
 }
 
 const char* ClassPathEntry::copy_path(const char* path) {
   char* copy = NEW_C_HEAP_ARRAY(char, strlen(path)+1, mtClass);
   strcpy(copy, path);

@@ -405,18 +343,18 @@
 ClassFileStream* ClassPathImageEntry::open_stream_for_loader(const char* name, ClassLoaderData* loader_data, TRAPS) {
   jlong size;
   JImageLocationRef location = (*JImageFindResource)(_jimage, "", get_jimage_version_string(), name, &size);
 
   if (location == 0) {
-    ResourceMark rm;
-    const char* pkg_name = ClassLoader::package_from_name(name);
+    TempNewSymbol class_name = SymbolTable::new_symbol(name);
+    TempNewSymbol pkg_name = InstanceKlass::package_from_name(class_name);
 
     if (pkg_name != NULL) {
       if (!Universe::is_module_initialized()) {
         location = (*JImageFindResource)(_jimage, JAVA_BASE_NAME, get_jimage_version_string(), name, &size);
       } else {
-        PackageEntry* package_entry = ClassLoader::get_package_entry(name, loader_data, CHECK_NULL);
+        PackageEntry* package_entry = ClassLoader::get_package_entry(pkg_name, loader_data, CHECK_NULL);
         if (package_entry != NULL) {
           ResourceMark rm;
           // Get the module name
           ModuleEntry* module = package_entry->module();
           assert(module != NULL, "Boot classLoader package missing module");

@@ -1027,29 +965,27 @@
 
 int ClassLoader::crc32(int crc, const char* buf, int len) {
   return (*Crc32)(crc, (const jbyte*)buf, len);
 }
 
-// Function add_package extracts the package from the fully qualified class name
-// and checks if the package is in the boot loader's package entry table.  If so,
-// then it sets the classpath_index in the package entry record.
+// Function add_package checks if the package of the InstanceKlass is in the
+// boot loader's package entry table.  If so, then it sets the classpath_index
+// in the package entry record.
 //
 // The classpath_index field is used to find the entry on the boot loader class
 // path for packages with classes loaded by the boot loader from -Xbootclasspath/a
 // in an unnamed module.  It is also used to indicate (for all packages whose
 // classes are loaded by the boot loader) that at least one of the package's
 // classes has been loaded.
-bool ClassLoader::add_package(const char *fullq_class_name, s2 classpath_index, TRAPS) {
-  assert(fullq_class_name != NULL, "just checking");
+bool ClassLoader::add_package(const InstanceKlass* ik, s2 classpath_index, TRAPS) {
+  assert(ik != NULL, "just checking");
 
   // Get package name from fully qualified class name.
-  ResourceMark rm(THREAD);
-  const char *cp = package_from_name(fullq_class_name);
-  if (cp != NULL) {
+  PackageEntry* ik_pkg = ik->package();
+  if (ik_pkg != NULL) {
     PackageEntryTable* pkg_entry_tbl = ClassLoaderData::the_null_class_loader_data()->packages();
-    TempNewSymbol pkg_symbol = SymbolTable::new_symbol(cp);
-    PackageEntry* pkg_entry = pkg_entry_tbl->lookup_only(pkg_symbol);
+    PackageEntry* pkg_entry = pkg_entry_tbl->lookup_only(ik_pkg->name());
     if (pkg_entry != NULL) {
       assert(classpath_index != -1, "Unexpected classpath_index");
       pkg_entry->set_classpath_index(classpath_index);
     } else {
       return false;

@@ -1164,11 +1100,13 @@
                                                     const char* const file_name,
                                                     TRAPS) {
   ClassFileStream* stream = NULL;
 
   // Find the class' defining module in the boot loader's module entry table
-  PackageEntry* pkg_entry = get_package_entry(class_name, ClassLoaderData::the_null_class_loader_data(), CHECK_NULL);
+  TempNewSymbol class_name_symbol = SymbolTable::new_symbol(class_name);
+  TempNewSymbol pkg_name = InstanceKlass::package_from_name(class_name_symbol);
+  PackageEntry* pkg_entry = get_package_entry(pkg_name, ClassLoaderData::the_null_class_loader_data(), CHECK_NULL);
   ModuleEntry* mod_entry = (pkg_entry != NULL) ? pkg_entry->module() : NULL;
 
   // If the module system has not defined java.base yet, then
   // classes loaded are assumed to be defined to java.base.
   // When java.base is eventually defined by the module system,

@@ -1315,11 +1253,11 @@
       log_error(cds)("Preload Error: Failed to load %s", class_name);
     }
     return NULL;
   }
 
-  if (!add_package(file_name, classpath_index, THREAD)) {
+  if (!add_package(result, classpath_index, THREAD)) {
     return NULL;
   }
 
   return result;
 }
< prev index next >