1 /*
   2  * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #include "precompiled.hpp"
  26 #include "classfile/classFileStream.hpp"
  27 #include "classfile/classListParser.hpp"
  28 #include "classfile/classLoader.hpp"
  29 #include "classfile/classLoaderData.inline.hpp"
  30 #include "classfile/classLoaderExt.hpp"
  31 #include "classfile/compactHashtable.inline.hpp"
  32 #include "classfile/dictionary.hpp"
  33 #include "classfile/javaClasses.hpp"
  34 #include "classfile/sharedClassUtil.hpp"
  35 #include "classfile/symbolTable.hpp"
  36 #include "classfile/systemDictionary.hpp"
  37 #include "classfile/systemDictionaryShared.hpp"
  38 #include "classfile/verificationType.hpp"
  39 #include "classfile/vmSymbols.hpp"
  40 #include "logging/log.hpp"
  41 #include "memory/allocation.hpp"
  42 #include "memory/filemap.hpp"
  43 #include "memory/metadataFactory.hpp"
  44 #include "memory/metaspaceClosure.hpp"
  45 #include "memory/oopFactory.hpp"
  46 #include "memory/resourceArea.hpp"
  47 #include "oops/instanceKlass.inline.hpp"
  48 #include "oops/klass.inline.hpp"
  49 #include "oops/objArrayOop.inline.hpp"
  50 #include "oops/oop.inline.hpp"
  51 #include "oops/typeArrayOop.inline.hpp"
  52 #include "runtime/handles.inline.hpp"
  53 #include "runtime/java.hpp"
  54 #include "runtime/javaCalls.hpp"
  55 #include "runtime/mutexLocker.hpp"
  56 #include "utilities/hashtable.inline.hpp"
  57 #include "utilities/stringUtils.hpp"
  58 
  59 
  60 objArrayOop SystemDictionaryShared::_shared_protection_domains  =  NULL;
  61 objArrayOop SystemDictionaryShared::_shared_jar_urls            =  NULL;
  62 objArrayOop SystemDictionaryShared::_shared_jar_manifests       =  NULL;
  63 
  64 static Mutex* SharedDictionary_lock = NULL;
  65 
  66 void SystemDictionaryShared::initialize(TRAPS) {
  67   if (_java_system_loader != NULL) {
  68     SharedDictionary_lock = new Mutex(Mutex::leaf, "SharedDictionary_lock", true);
  69 
  70     // These classes need to be initialized before calling get_shared_jar_manifest(), etc.
  71     SystemDictionary::ByteArrayInputStream_klass()->initialize(CHECK);
  72     SystemDictionary::File_klass()->initialize(CHECK);
  73     SystemDictionary::Jar_Manifest_klass()->initialize(CHECK);
  74     SystemDictionary::CodeSource_klass()->initialize(CHECK);
  75   }
  76 }
  77 
  78 oop SystemDictionaryShared::shared_protection_domain(int index) {
  79   return _shared_protection_domains->obj_at(index);
  80 }
  81 
  82 oop SystemDictionaryShared::shared_jar_url(int index) {
  83   return _shared_jar_urls->obj_at(index);
  84 }
  85 
  86 oop SystemDictionaryShared::shared_jar_manifest(int index) {
  87   return _shared_jar_manifests->obj_at(index);
  88 }
  89 
  90 
  91 Handle SystemDictionaryShared::get_shared_jar_manifest(int shared_path_index, TRAPS) {
  92   Handle empty;
  93   Handle manifest ;
  94   if (shared_jar_manifest(shared_path_index) == NULL) {
  95     SharedClassPathEntryExt* ent = (SharedClassPathEntryExt*)FileMapInfo::shared_classpath(shared_path_index);
  96     long size = ent->manifest_size();
  97     if (size <= 0) {
  98       return empty; // No manifest - return NULL handle
  99     }
 100 
 101     // ByteArrayInputStream bais = new ByteArrayInputStream(buf);
 102     InstanceKlass* bais_klass = SystemDictionary::ByteArrayInputStream_klass();
 103     Handle bais = bais_klass->allocate_instance_handle(CHECK_(empty));
 104     {
 105       const char* src = ent->manifest();
 106       assert(src != NULL, "No Manifest data");
 107       typeArrayOop buf = oopFactory::new_byteArray(size, CHECK_(empty));
 108       typeArrayHandle bufhandle(THREAD, buf);
 109       char* dst = (char*)(buf->byte_at_addr(0));
 110       memcpy(dst, src, (size_t)size);
 111 
 112       JavaValue result(T_VOID);
 113       JavaCalls::call_special(&result, bais, bais_klass,
 114                               vmSymbols::object_initializer_name(),
 115                               vmSymbols::byte_array_void_signature(),
 116                               bufhandle, CHECK_(empty));
 117     }
 118 
 119     // manifest = new Manifest(bais)
 120     InstanceKlass* manifest_klass = SystemDictionary::Jar_Manifest_klass();
 121     manifest = manifest_klass->allocate_instance_handle(CHECK_(empty));
 122     {
 123       JavaValue result(T_VOID);
 124       JavaCalls::call_special(&result, manifest, manifest_klass,
 125                               vmSymbols::object_initializer_name(),
 126                               vmSymbols::input_stream_void_signature(),
 127                               bais, CHECK_(empty));
 128     }
 129     atomic_set_shared_jar_manifest(shared_path_index, manifest());
 130   }
 131 
 132   manifest = Handle(THREAD, shared_jar_manifest(shared_path_index));
 133   assert(manifest.not_null(), "sanity");
 134   return manifest;
 135 }
 136 
 137 Handle SystemDictionaryShared::get_shared_jar_url(int shared_path_index, TRAPS) {
 138   Handle url_h;
 139   if (shared_jar_url(shared_path_index) == NULL) {
 140     JavaValue result(T_OBJECT);
 141     const char* path = FileMapInfo::shared_classpath_name(shared_path_index);
 142     Handle path_string = java_lang_String::create_from_str(path, CHECK_(url_h));
 143     Klass* classLoaders_klass =
 144         SystemDictionary::jdk_internal_loader_ClassLoaders_klass();
 145         JavaCalls::call_static(&result, classLoaders_klass,
 146                                vmSymbols::toFileURL_name(),
 147                                vmSymbols::toFileURL_signature(),
 148                                path_string, CHECK_(url_h));
 149 
 150     atomic_set_shared_jar_url(shared_path_index, (oop)result.get_jobject());
 151   }
 152 
 153   url_h = Handle(THREAD, shared_jar_url(shared_path_index));
 154   assert(url_h.not_null(), "sanity");
 155   return url_h;
 156 }
 157 
 158 Handle SystemDictionaryShared::get_package_name(Symbol* class_name, TRAPS) {
 159   ResourceMark rm(THREAD);
 160   Handle pkgname_string;
 161   char* pkgname = (char*) ClassLoader::package_from_name((const char*) class_name->as_C_string());
 162   if (pkgname != NULL) { // Package prefix found
 163     StringUtils::replace_no_expand(pkgname, "/", ".");
 164     pkgname_string = java_lang_String::create_from_str(pkgname,
 165                                                        CHECK_(pkgname_string));
 166   }
 167   return pkgname_string;
 168 }
 169 
 170 // Define Package for shared app classes from JAR file and also checks for
 171 // package sealing (all done in Java code)
 172 // See http://docs.oracle.com/javase/tutorial/deployment/jar/sealman.html
 173 void SystemDictionaryShared::define_shared_package(Symbol*  class_name,
 174                                                    Handle class_loader,
 175                                                    Handle manifest,
 176                                                    Handle url,
 177                                                    TRAPS) {
 178   assert(class_loader == _java_system_loader, "unexpected class loader");
 179   // get_package_name() returns a NULL handle if the class is in unnamed package
 180   Handle pkgname_string = get_package_name(class_name, CHECK);
 181   if (pkgname_string.not_null()) {
 182     Klass* app_classLoader_klass = SystemDictionary::jdk_internal_loader_ClassLoaders_AppClassLoader_klass();
 183     JavaValue result(T_OBJECT);
 184     JavaCallArguments args(3);
 185     args.set_receiver(class_loader);
 186     args.push_oop(pkgname_string);
 187     args.push_oop(manifest);
 188     args.push_oop(url);
 189     JavaCalls::call_virtual(&result, app_classLoader_klass,
 190                             vmSymbols::defineOrCheckPackage_name(),
 191                             vmSymbols::defineOrCheckPackage_signature(),
 192                             &args,
 193                             CHECK);
 194   }
 195 }
 196 
 197 // Define Package for shared app/platform classes from named module
 198 void SystemDictionaryShared::define_shared_package(Symbol* class_name,
 199                                                    Handle class_loader,
 200                                                    ModuleEntry* mod_entry,
 201                                                    TRAPS) {
 202   assert(mod_entry != NULL, "module_entry should not be NULL");
 203   Handle module_handle(THREAD, mod_entry->module());
 204 
 205   Handle pkg_name = get_package_name(class_name, CHECK);
 206   assert(pkg_name.not_null(), "Package should not be null for class in named module");
 207 
 208   Klass* classLoader_klass;
 209   if (SystemDictionary::is_system_class_loader(class_loader())) {
 210     classLoader_klass = SystemDictionary::jdk_internal_loader_ClassLoaders_AppClassLoader_klass();
 211   } else {
 212     assert(SystemDictionary::is_platform_class_loader(class_loader()), "unexpected classloader");
 213     classLoader_klass = SystemDictionary::jdk_internal_loader_ClassLoaders_PlatformClassLoader_klass();
 214   }
 215 
 216   JavaValue result(T_OBJECT);
 217   JavaCallArguments args(2);
 218   args.set_receiver(class_loader);
 219   args.push_oop(pkg_name);
 220   args.push_oop(module_handle);
 221   JavaCalls::call_virtual(&result, classLoader_klass,
 222                           vmSymbols::definePackage_name(),
 223                           vmSymbols::definePackage_signature(),
 224                           &args,
 225                           CHECK);
 226 }
 227 
 228 // Get the ProtectionDomain associated with the CodeSource from the classloader.
 229 Handle SystemDictionaryShared::get_protection_domain_from_classloader(Handle class_loader,
 230                                                                       Handle url, TRAPS) {
 231   // CodeSource cs = new CodeSource(url, null);
 232   InstanceKlass* cs_klass = SystemDictionary::CodeSource_klass();
 233   Handle cs = cs_klass->allocate_instance_handle(CHECK_NH);
 234   JavaValue void_result(T_VOID);
 235   JavaCalls::call_special(&void_result, cs, cs_klass,
 236                           vmSymbols::object_initializer_name(),
 237                           vmSymbols::url_code_signer_array_void_signature(),
 238                           url, Handle(), CHECK_NH);
 239 
 240   // protection_domain = SecureClassLoader.getProtectionDomain(cs);
 241   Klass* secureClassLoader_klass = SystemDictionary::SecureClassLoader_klass();
 242   JavaValue obj_result(T_OBJECT);
 243   JavaCalls::call_virtual(&obj_result, class_loader, secureClassLoader_klass,
 244                           vmSymbols::getProtectionDomain_name(),
 245                           vmSymbols::getProtectionDomain_signature(),
 246                           cs, CHECK_NH);
 247   return Handle(THREAD, (oop)obj_result.get_jobject());
 248 }
 249 
 250 // Returns the ProtectionDomain associated with the JAR file identified by the url.
 251 Handle SystemDictionaryShared::get_shared_protection_domain(Handle class_loader,
 252                                                             int shared_path_index,
 253                                                             Handle url,
 254                                                             TRAPS) {
 255   Handle protection_domain;
 256   if (shared_protection_domain(shared_path_index) == NULL) {
 257     Handle pd = get_protection_domain_from_classloader(class_loader, url, THREAD);
 258     atomic_set_shared_protection_domain(shared_path_index, pd());
 259   }
 260 
 261   // Acquire from the cache because if another thread beats the current one to
 262   // set the shared protection_domain and the atomic_set fails, the current thread
 263   // needs to get the updated protection_domain from the cache.
 264   protection_domain = Handle(THREAD, shared_protection_domain(shared_path_index));
 265   assert(protection_domain.not_null(), "sanity");
 266   return protection_domain;
 267 }
 268 
 269 // Returns the ProtectionDomain associated with the moduleEntry.
 270 Handle SystemDictionaryShared::get_shared_protection_domain(Handle class_loader,
 271                                                             ModuleEntry* mod, TRAPS) {
 272   ClassLoaderData *loader_data = mod->loader_data();
 273   Handle protection_domain;
 274   if (mod->shared_protection_domain() == NULL) {
 275     Symbol* location = mod->location();
 276     if (location != NULL) {
 277       Handle url_string = java_lang_String::create_from_symbol(
 278                                  location, CHECK_(protection_domain));
 279       JavaValue result(T_OBJECT);
 280       Klass* classLoaders_klass =
 281         SystemDictionary::jdk_internal_loader_ClassLoaders_klass();
 282         JavaCalls::call_static(&result, classLoaders_klass, vmSymbols::toFileURL_name(),
 283                                vmSymbols::toFileURL_signature(),
 284                                url_string, CHECK_(protection_domain));
 285       Handle url = Handle(THREAD, (oop)result.get_jobject());
 286 
 287       Handle pd = get_protection_domain_from_classloader(class_loader, url, THREAD);
 288       mod->set_shared_protection_domain(loader_data, pd);
 289     }
 290   }
 291 
 292   protection_domain = Handle(THREAD, mod->shared_protection_domain());
 293   assert(protection_domain.not_null(), "sanity");
 294   return protection_domain;
 295 }
 296 
 297 // Initializes the java.lang.Package and java.security.ProtectionDomain objects associated with
 298 // the given InstanceKlass.
 299 // Returns the ProtectionDomain for the InstanceKlass.
 300 Handle SystemDictionaryShared::init_security_info(Handle class_loader, InstanceKlass* ik, TRAPS) {
 301   Handle pd;
 302 
 303   if (ik != NULL) {
 304     int index = ik->shared_classpath_index();
 305     assert(index >= 0, "Sanity");
 306     SharedClassPathEntryExt* ent =
 307             (SharedClassPathEntryExt*)FileMapInfo::shared_classpath(index);
 308     Symbol* class_name = ik->name();
 309 
 310     if (ent->is_modules_image()) {
 311       // For shared app/platform classes originated from the run-time image:
 312       //   The ProtectionDomains are cached in the corresponding ModuleEntries
 313       //   for fast access by the VM.
 314       ResourceMark rm;
 315       ClassLoaderData *loader_data =
 316                 ClassLoaderData::class_loader_data(class_loader());
 317       PackageEntryTable* pkgEntryTable = loader_data->packages();
 318       TempNewSymbol pkg_name = InstanceKlass::package_from_name(class_name, CHECK_(pd));
 319       if (pkg_name != NULL) {
 320         PackageEntry* pkg_entry = pkgEntryTable->lookup_only(pkg_name);
 321         if (pkg_entry != NULL) {
 322           ModuleEntry* mod_entry = pkg_entry->module();
 323           pd = get_shared_protection_domain(class_loader, mod_entry, THREAD);
 324           define_shared_package(class_name, class_loader, mod_entry, CHECK_(pd));
 325         }
 326       }
 327     } else {
 328       // For shared app/platform classes originated from JAR files on the class path:
 329       //   Each of the 3 SystemDictionaryShared::_shared_xxx arrays has the same length
 330       //   as the shared classpath table in the shared archive (see
 331       //   FileMap::_classpath_entry_table in filemap.hpp for details).
 332       //
 333       //   If a shared InstanceKlass k is loaded from the class path, let
 334       //
 335       //     index = k->shared_classpath_index():
 336       //
 337       //   FileMap::_classpath_entry_table[index] identifies the JAR file that contains k.
 338       //
 339       //   k's protection domain is:
 340       //
 341       //     ProtectionDomain pd = _shared_protection_domains[index];
 342       //
 343       //   and k's Package is initialized using
 344       //
 345       //     manifest = _shared_jar_manifests[index];
 346       //     url = _shared_jar_urls[index];
 347       //     define_shared_package(class_name, class_loader, manifest, url, CHECK_(pd));
 348       //
 349       //   Note that if an element of these 3 _shared_xxx arrays is NULL, it will be initialized by
 350       //   the corresponding SystemDictionaryShared::get_shared_xxx() function.
 351       Handle manifest = get_shared_jar_manifest(index, CHECK_(pd));
 352       Handle url = get_shared_jar_url(index, CHECK_(pd));
 353       define_shared_package(class_name, class_loader, manifest, url, CHECK_(pd));
 354       pd = get_shared_protection_domain(class_loader, index, url, CHECK_(pd));
 355     }
 356   }
 357   return pd;
 358 }
 359 
 360 // Currently AppCDS only archives classes from the run-time image, the
 361 // -Xbootclasspath/a path, and the class path. The following rules need to be
 362 // revised when AppCDS is changed to archive classes from other code sources
 363 // in the future, for example the module path (specified by -p).
 364 //
 365 // Check if a shared class can be loaded by the specific classloader. Following
 366 // are the "visible" archived classes for different classloaders.
 367 //
 368 // NULL classloader:
 369 //   - see SystemDictionary::is_shared_class_visible()
 370 // Platform classloader:
 371 //   - Module class from "modules" jimage. ModuleEntry must be defined in the
 372 //     classloader.
 373 // App Classloader:
 374 //   - Module class from "modules" jimage. ModuleEntry must be defined in the
 375 //     classloader.
 376 //   - Class from -cp. The class must have no PackageEntry defined in any of the
 377 //     boot/platform/app classloader, or must be in the unnamed module defined in the
 378 //     AppClassLoader.
 379 bool SystemDictionaryShared::is_shared_class_visible_for_classloader(
 380                                                      InstanceKlass* ik,
 381                                                      Handle class_loader,
 382                                                      const char* pkg_string,
 383                                                      Symbol* pkg_name,
 384                                                      PackageEntry* pkg_entry,
 385                                                      ModuleEntry* mod_entry,
 386                                                      TRAPS) {
 387   assert(class_loader.not_null(), "Class loader should not be NULL");
 388   assert(Universe::is_module_initialized(), "Module system is not initialized");
 389 
 390   int path_index = ik->shared_classpath_index();
 391   SharedClassPathEntry* ent =
 392             (SharedClassPathEntry*)FileMapInfo::shared_classpath(path_index);
 393 
 394   if (SystemDictionary::is_platform_class_loader(class_loader())) {
 395     assert(ent != NULL, "shared class for PlatformClassLoader should have valid SharedClassPathEntry");
 396     // The PlatformClassLoader can only load archived class originated from the
 397     // run-time image. The class' PackageEntry/ModuleEntry must be
 398     // defined by the PlatformClassLoader.
 399     if (mod_entry != NULL) {
 400       // PackageEntry/ModuleEntry is found in the classloader. Check if the
 401       // ModuleEntry's location agrees with the archived class' origination.
 402       if (ent->is_modules_image() && mod_entry->location()->starts_with("jrt:")) {
 403         return true; // Module class from the "modules" jimage
 404       }
 405     }
 406   } else if (SystemDictionary::is_system_class_loader(class_loader())) {
 407     assert(ent != NULL, "shared class for system loader should have valid SharedClassPathEntry");
 408     if (pkg_string == NULL) {
 409       // The archived class is in the unnamed package. Currently, the boot image
 410       // does not contain any class in the unnamed package.
 411       assert(!ent->is_modules_image(), "Class in the unnamed package must be from the classpath");
 412       if (path_index >= ClassLoaderExt::app_paths_start_index()) {
 413         return true;
 414       }
 415     } else {
 416       // Check if this is from a PackageEntry/ModuleEntry defined in the AppClassloader.
 417       if (pkg_entry == NULL) {
 418         // It's not guaranteed that the class is from the classpath if the
 419         // PackageEntry cannot be found from the AppClassloader. Need to check
 420         // the boot and platform classloader as well.
 421         if (get_package_entry(pkg_name, ClassLoaderData::class_loader_data_or_null(SystemDictionary::java_platform_loader())) == NULL &&
 422             get_package_entry(pkg_name, ClassLoaderData::the_null_class_loader_data()) == NULL) {
 423           // The PackageEntry is not defined in any of the boot/platform/app classloaders.
 424           // The archived class must from -cp path and not from the run-time image.
 425           if (!ent->is_modules_image() && path_index >= ClassLoaderExt::app_paths_start_index()) {
 426             return true;
 427           }
 428         }
 429       } else if (mod_entry != NULL) {
 430         // The package/module is defined in the AppClassLoader. Currently we only
 431         // support archiving application module class from the run-time image.
 432         // Packages from the -cp path are in the unnamed_module.
 433         if ((ent->is_modules_image() && mod_entry->location()->starts_with("jrt:")) ||
 434             (pkg_entry->in_unnamed_module() && path_index >= ClassLoaderExt::app_paths_start_index())) {
 435           DEBUG_ONLY( \
 436             ClassLoaderData* loader_data = class_loader_data(class_loader); \
 437             if (pkg_entry->in_unnamed_module()) \
 438               assert(mod_entry == loader_data->unnamed_module(), "the unnamed module is not defined in the classloader");)
 439 
 440           return true;
 441         }
 442       }
 443     }
 444   } else {
 445     // TEMP: if a shared class can be found by a custom loader, consider it visible now.
 446     // FIXME: is this actually correct?
 447     return true;
 448   }
 449   return false;
 450 }
 451 
 452 // The following stack shows how this code is reached:
 453 //
 454 //   [0] SystemDictionaryShared::find_or_load_shared_class()
 455 //   [1] JVM_FindLoadedClass
 456 //   [2] java.lang.ClassLoader.findLoadedClass0()
 457 //   [3] java.lang.ClassLoader.findLoadedClass()
 458 //   [4] java.lang.ClassLoader.loadClass()
 459 //   [5] jdk.internal.loader.ClassLoaders$AppClassLoader_klass.loadClass()
 460 //
 461 // Because AppCDS supports only the PlatformClassLoader and AppClassLoader, we make the following
 462 // assumptions (based on the JDK 8.0 source code):
 463 //
 464 // [a] these two loaders use the default implementation of
 465 //     ClassLoader.loadClass(String name, boolean resolve), which
 466 // [b] calls findLoadedClass(name), immediately followed by parent.loadClass(),
 467 //     immediately followed by findClass(name).
 468 // [c] If the requested class is a shared class of the current class loader, parent.loadClass()
 469 //     always returns null, and
 470 // [d] if AppCDS is not enabled, the class would be loaded by findClass() by decoding it from a
 471 //     JAR file and then parsed.
 472 //
 473 // Given these assumptions, we intercept the findLoadedClass() call to invoke
 474 // SystemDictionaryShared::find_or_load_shared_class() to load the shared class from
 475 // the archive. The reasons are:
 476 //
 477 // + Because AppCDS is a commercial feature, we want to hide the implementation. There
 478 //   is currently no easy way to hide Java code, so we did it with native code.
 479 // + Start-up is improved because we avoid decoding the JAR file, and avoid delegating
 480 //   to the parent (since we know the parent will not find this class).
 481 //
 482 // NOTE: there's a lot of assumption about the Java code. If any of that change, this
 483 // needs to be redesigned.
 484 //
 485 // An alternative is to modify the Java code of AppClassLoader.loadClass().
 486 //
 487 InstanceKlass* SystemDictionaryShared::find_or_load_shared_class(
 488                  Symbol* name, Handle class_loader, TRAPS) {
 489   if (DumpSharedSpaces) {
 490     return NULL;
 491   }
 492 
 493   InstanceKlass* k = NULL;
 494   if (shared_dictionary() != NULL &&
 495       UseAppCDS && (SystemDictionary::is_system_class_loader(class_loader()) ||
 496                     SystemDictionary::is_platform_class_loader(class_loader()))) {
 497 
 498     // Fix for 4474172; see evaluation for more details
 499     class_loader = Handle(
 500       THREAD, java_lang_ClassLoader::non_reflection_class_loader(class_loader()));
 501     ClassLoaderData *loader_data = register_loader(class_loader);
 502     Dictionary* dictionary = loader_data->dictionary();
 503 
 504     unsigned int d_hash = dictionary->compute_hash(name);
 505 
 506     bool DoObjectLock = true;
 507     if (is_parallelCapable(class_loader)) {
 508       DoObjectLock = false;
 509     }
 510 
 511     // Make sure we are synchronized on the class loader before we proceed
 512     //
 513     // Note: currently, find_or_load_shared_class is called only from
 514     // JVM_FindLoadedClass and used for PlatformClassLoader and AppClassLoader,
 515     // which are parallel-capable loaders, so this lock is NOT taken.
 516     Handle lockObject = compute_loader_lock_object(class_loader, THREAD);
 517     check_loader_lock_contention(lockObject, THREAD);
 518     ObjectLocker ol(lockObject, THREAD, DoObjectLock);
 519 
 520     {
 521       MutexLocker mu(SystemDictionary_lock, THREAD);
 522       Klass* check = find_class(d_hash, name, dictionary);
 523       if (check != NULL) {
 524         return InstanceKlass::cast(check);
 525       }
 526     }
 527 
 528     k = load_shared_class_for_builtin_loader(name, class_loader, THREAD);
 529     if (k != NULL) {
 530       define_instance_class(k, CHECK_NULL);
 531     }
 532   }
 533 
 534   return k;
 535 }
 536 
 537 InstanceKlass* SystemDictionaryShared::load_shared_class_for_builtin_loader(
 538                  Symbol* class_name, Handle class_loader, TRAPS) {
 539   assert(UseAppCDS && shared_dictionary() != NULL, "already checked");
 540   Klass* k = shared_dictionary()->find_class_for_builtin_loader(class_name);
 541 
 542   if (k != NULL) {
 543     InstanceKlass* ik = InstanceKlass::cast(k);
 544     if ((ik->is_shared_app_class() &&
 545          SystemDictionary::is_system_class_loader(class_loader()))  ||
 546         (ik->is_shared_platform_class() &&
 547          SystemDictionary::is_platform_class_loader(class_loader()))) {
 548       Handle protection_domain =
 549         SystemDictionaryShared::init_security_info(class_loader, ik, CHECK_NULL);
 550       return load_shared_class(ik, class_loader, protection_domain, THREAD);
 551     }
 552   }
 553 
 554   return NULL;
 555 }
 556 
 557 void SystemDictionaryShared::oops_do(OopClosure* f) {
 558   f->do_oop((oop*)&_shared_protection_domains);
 559   f->do_oop((oop*)&_shared_jar_urls);
 560   f->do_oop((oop*)&_shared_jar_manifests);
 561 }
 562 
 563 void SystemDictionaryShared::allocate_shared_protection_domain_array(int size, TRAPS) {
 564   if (_shared_protection_domains == NULL) {
 565     _shared_protection_domains = oopFactory::new_objArray(
 566         SystemDictionary::ProtectionDomain_klass(), size, CHECK);
 567   }
 568 }
 569 
 570 void SystemDictionaryShared::allocate_shared_jar_url_array(int size, TRAPS) {
 571   if (_shared_jar_urls == NULL) {
 572     _shared_jar_urls = oopFactory::new_objArray(
 573         SystemDictionary::URL_klass(), size, CHECK);
 574   }
 575 }
 576 
 577 void SystemDictionaryShared::allocate_shared_jar_manifest_array(int size, TRAPS) {
 578   if (_shared_jar_manifests == NULL) {
 579     _shared_jar_manifests = oopFactory::new_objArray(
 580         SystemDictionary::Jar_Manifest_klass(), size, CHECK);
 581   }
 582 }
 583 
 584 void SystemDictionaryShared::allocate_shared_data_arrays(int size, TRAPS) {
 585   allocate_shared_protection_domain_array(size, CHECK);
 586   allocate_shared_jar_url_array(size, CHECK);
 587   allocate_shared_jar_manifest_array(size, CHECK);
 588 }
 589 
 590 
 591 InstanceKlass* SystemDictionaryShared::lookup_from_stream(const Symbol* class_name,
 592                                                           Handle class_loader,
 593                                                           Handle protection_domain,
 594                                                           const ClassFileStream* cfs,
 595                                                           TRAPS) {
 596   if (!UseAppCDS || shared_dictionary() == NULL) {
 597     return NULL;
 598   }
 599   if (class_name == NULL) {  // don't do this for anonymous classes
 600     return NULL;
 601   }
 602   if (class_loader.is_null() ||
 603       SystemDictionary::is_system_class_loader(class_loader()) ||
 604       SystemDictionary::is_platform_class_loader(class_loader())) {
 605     // This function is called for loading only UNREGISTERED classes.
 606     // Do nothing for the BUILTIN loaders.
 607     return NULL;
 608   }
 609 
 610   ClassLoaderData* loader_data = ClassLoaderData::class_loader_data(class_loader());
 611   Klass* k;
 612 
 613   { // UNREGISTERED loader
 614     if (!shared_dictionary()->class_exists_for_unregistered_loader(class_name)) {
 615       // No classes of this name for unregistered loaders.
 616       return NULL;
 617     }
 618 
 619     int clsfile_size  = cfs->length();
 620     int clsfile_crc32 = ClassLoader::crc32(0, (const char*)cfs->buffer(), cfs->length());
 621 
 622     k = shared_dictionary()->find_class_for_unregistered_loader(class_name,
 623                                                                 clsfile_size, clsfile_crc32);
 624   }
 625 
 626   if (k == NULL) { // not archived
 627     return NULL;
 628   }
 629 
 630   return acquire_class_for_current_thread(InstanceKlass::cast(k), class_loader,
 631                                           protection_domain, THREAD);
 632 }
 633 
 634 InstanceKlass* SystemDictionaryShared::acquire_class_for_current_thread(
 635                    InstanceKlass *ik,
 636                    Handle class_loader,
 637                    Handle protection_domain,
 638                    TRAPS) {
 639   ClassLoaderData* loader_data = ClassLoaderData::class_loader_data(class_loader());
 640 
 641   {
 642     MutexLocker mu(SharedDictionary_lock, THREAD);
 643     if (ik->class_loader_data() != NULL) {
 644       //    ik is already loaded (by this loader or by a different loader)
 645       // or ik is being loaded by a different thread (by this loader or by a different loader)
 646       return NULL;
 647     }
 648 
 649     // No other thread has acquired this yet, so give it to *this thread*
 650     ik->set_class_loader_data(loader_data);
 651   }
 652 
 653   // No longer holding SharedDictionary_lock
 654   // No need to lock, as <ik> can be held only by a single thread.
 655   loader_data->add_class(ik);
 656 
 657   // Load and check super/interfaces, restore unsharable info
 658   InstanceKlass* shared_klass = load_shared_class(ik, class_loader, protection_domain, THREAD);
 659   if (shared_klass == NULL || HAS_PENDING_EXCEPTION) {
 660     // TODO: clean up <ik> so it can be used again
 661     return NULL;
 662   }
 663 
 664   return shared_klass;
 665 }
 666 
 667 bool SystemDictionaryShared::add_non_builtin_klass(Symbol* name, ClassLoaderData* loader_data,
 668                                                    InstanceKlass* k,
 669                                                    TRAPS) {
 670   assert(DumpSharedSpaces, "only when dumping");
 671   assert(UseAppCDS && boot_loader_dictionary() != NULL, "must be");
 672 
 673   if (boot_loader_dictionary()->add_non_builtin_klass(name, loader_data, k)) {
 674     MutexLocker mu_r(Compile_lock, THREAD); // not really necessary, but add_to_hierarchy asserts this.
 675     add_to_hierarchy(k, CHECK_0);
 676     return true;
 677   }
 678   return false;
 679 }
 680 
 681 // This function is called to resolve the super/interfaces of shared classes for
 682 // non-built-in loaders. E.g., ChildClass in the below example
 683 // where "super:" (and optionally "interface:") have been specified.
 684 //
 685 // java/lang/Object id: 0
 686 // Interface   id: 2 super: 0 source: cust.jar
 687 // ChildClass  id: 4 super: 0 interfaces: 2 source: cust.jar
 688 Klass* SystemDictionaryShared::dump_time_resolve_super_or_fail(
 689     Symbol* child_name, Symbol* class_name, Handle class_loader,
 690     Handle protection_domain, bool is_superclass, TRAPS) {
 691 
 692   assert(DumpSharedSpaces, "only when dumping");
 693 
 694   ClassListParser* parser = ClassListParser::instance();
 695   if (parser == NULL) {
 696     // We're still loading the well-known classes, before the ClassListParser is created.
 697     return NULL;
 698   }
 699   if (child_name->equals(parser->current_class_name())) {
 700     // When this function is called, all the numbered super and interface types
 701     // must have already been loaded. Hence this function is never recursively called.
 702     if (is_superclass) {
 703       return parser->lookup_super_for_current_class(class_name);
 704     } else {
 705       return parser->lookup_interface_for_current_class(class_name);
 706     }
 707   } else {
 708     // The VM is not trying to resolve a super type of parser->current_class_name().
 709     // Instead, it's resolving an error class (because parser->current_class_name() has
 710     // failed parsing or verification). Don't do anything here.
 711     return NULL;
 712   }
 713 }
 714 
 715 struct SharedMiscInfo {
 716   Klass* _klass;
 717   int _clsfile_size;
 718   int _clsfile_crc32;
 719 };
 720 
 721 static GrowableArray<SharedMiscInfo>* misc_info_array = NULL;
 722 
 723 void SystemDictionaryShared::set_shared_class_misc_info(Klass* k, ClassFileStream* cfs) {
 724   assert(DumpSharedSpaces, "only when dumping");
 725   int clsfile_size  = cfs->length();
 726   int clsfile_crc32 = ClassLoader::crc32(0, (const char*)cfs->buffer(), cfs->length());
 727 
 728   if (misc_info_array == NULL) {
 729     misc_info_array = new (ResourceObj::C_HEAP, mtClass) GrowableArray<SharedMiscInfo>(20, /*c heap*/ true);
 730   }
 731 
 732   SharedMiscInfo misc_info;
 733   DEBUG_ONLY({
 734       for (int i=0; i<misc_info_array->length(); i++) {
 735         misc_info = misc_info_array->at(i);
 736         assert(misc_info._klass != k, "cannot call set_shared_class_misc_info twice for the same class");
 737       }
 738     });
 739 
 740   misc_info._klass = k;
 741   misc_info._clsfile_size = clsfile_size;
 742   misc_info._clsfile_crc32 = clsfile_crc32;
 743 
 744   misc_info_array->append(misc_info);
 745 }
 746 
 747 void SystemDictionaryShared::init_shared_dictionary_entry(Klass* k, DictionaryEntry* ent) {
 748   SharedDictionaryEntry* entry = (SharedDictionaryEntry*)ent;
 749   entry->_id = -1;
 750   entry->_clsfile_size = -1;
 751   entry->_clsfile_crc32 = -1;
 752   entry->_verifier_constraints = NULL;
 753   entry->_verifier_constraint_flags = NULL;
 754 
 755   if (misc_info_array != NULL) {
 756     for (int i=0; i<misc_info_array->length(); i++) {
 757       SharedMiscInfo misc_info = misc_info_array->at(i);
 758       if (misc_info._klass == k) {
 759         entry->_clsfile_size = misc_info._clsfile_size;
 760         entry->_clsfile_crc32 = misc_info._clsfile_crc32;
 761         misc_info_array->remove_at(i);
 762         return;
 763       }
 764     }
 765   }
 766 }
 767 
 768 bool SystemDictionaryShared::add_verification_constraint(Klass* k, Symbol* name,
 769          Symbol* from_name, bool from_field_is_protected, bool from_is_array, bool from_is_object) {
 770   assert(DumpSharedSpaces, "called at dump time only");
 771 
 772   // Skip anonymous classes, which are not archived as they are not in
 773   // dictionary (see assert_no_anonymoys_classes_in_dictionaries() in
 774   // VM_PopulateDumpSharedSpace::doit()).
 775   if (k->class_loader_data()->is_anonymous()) {
 776     return true; // anonymous classes are not archived, skip
 777   }
 778 
 779   SharedDictionaryEntry* entry = ((SharedDictionary*)(k->class_loader_data()->dictionary()))->find_entry_for(k);
 780   ResourceMark rm;
 781   // Lambda classes are not archived and will be regenerated at runtime.
 782   if (entry == NULL && strstr(k->name()->as_C_string(), "Lambda$") != NULL) {
 783     return true;
 784   }
 785   assert(entry != NULL, "class should be in dictionary before being verified");
 786   entry->add_verification_constraint(name, from_name, from_field_is_protected,
 787                                      from_is_array, from_is_object);
 788   if (entry->is_builtin()) {
 789     // For builtin class loaders, we can try to complete the verification check at dump time,
 790     // because we can resolve all the constraint classes.
 791     return false;
 792   } else {
 793     // For non-builtin class loaders, we cannot complete the verification check at dump time,
 794     // because at dump time we don't know how to resolve classes for such loaders.
 795     return true;
 796   }
 797 }
 798 
 799 void SystemDictionaryShared::finalize_verification_constraints() {
 800   boot_loader_dictionary()->finalize_verification_constraints();
 801 }
 802 
 803 void SystemDictionaryShared::check_verification_constraints(InstanceKlass* klass,
 804                                                              TRAPS) {
 805   assert(!DumpSharedSpaces && UseSharedSpaces, "called at run time with CDS enabled only");
 806   SharedDictionaryEntry* entry = shared_dictionary()->find_entry_for(klass);
 807   assert(entry != NULL, "call this only for shared classes");
 808   entry->check_verification_constraints(klass, THREAD);
 809 }
 810 
 811 SharedDictionaryEntry* SharedDictionary::find_entry_for(Klass* klass) {
 812   Symbol* class_name = klass->name();
 813   unsigned int hash = compute_hash(class_name);
 814   int index = hash_to_index(hash);
 815 
 816   for (SharedDictionaryEntry* entry = bucket(index);
 817                               entry != NULL;
 818                               entry = entry->next()) {
 819     if (entry->hash() == hash && entry->literal() == klass) {
 820       return entry;
 821     }
 822   }
 823 
 824   return NULL;
 825 }
 826 
 827 void SharedDictionary::finalize_verification_constraints() {
 828   int bytes = 0, count = 0;
 829   for (int index = 0; index < table_size(); index++) {
 830     for (SharedDictionaryEntry *probe = bucket(index);
 831                                 probe != NULL;
 832                                probe = probe->next()) {
 833       int n = probe->finalize_verification_constraints();
 834       if (n > 0) {
 835         bytes += n;
 836         count ++;
 837       }
 838     }
 839   }
 840   if (log_is_enabled(Info, cds, verification)) {
 841     double avg = 0;
 842     if (count > 0) {
 843       avg = double(bytes) / double(count);
 844     }
 845     log_info(cds, verification)("Recorded verification constraints for %d classes = %d bytes (avg = %.2f bytes) ", count, bytes, avg);
 846   }
 847 }
 848 
 849 void SharedDictionaryEntry::add_verification_constraint(Symbol* name,
 850          Symbol* from_name, bool from_field_is_protected, bool from_is_array, bool from_is_object) {
 851   if (_verifier_constraints == NULL) {
 852     _verifier_constraints = new(ResourceObj::C_HEAP, mtClass) GrowableArray<Symbol*>(8, true, mtClass);
 853   }
 854   if (_verifier_constraint_flags == NULL) {
 855     _verifier_constraint_flags = new(ResourceObj::C_HEAP, mtClass) GrowableArray<char>(4, true, mtClass);
 856   }
 857   GrowableArray<Symbol*>* vc_array = (GrowableArray<Symbol*>*)_verifier_constraints;
 858   for (int i=0; i<vc_array->length(); i+= 2) {
 859     if (name      == vc_array->at(i) &&
 860         from_name == vc_array->at(i+1)) {
 861       return;
 862     }
 863   }
 864   vc_array->append(name);
 865   vc_array->append(from_name);
 866 
 867   GrowableArray<char>* vcflags_array = (GrowableArray<char>*)_verifier_constraint_flags;
 868   char c = 0;
 869   c |= from_field_is_protected ? FROM_FIELD_IS_PROTECTED : 0;
 870   c |= from_is_array           ? FROM_IS_ARRAY           : 0;
 871   c |= from_is_object          ? FROM_IS_OBJECT          : 0;
 872   vcflags_array->append(c);
 873 
 874   if (log_is_enabled(Trace, cds, verification)) {
 875     ResourceMark rm;
 876     log_trace(cds, verification)("add_verification_constraint: %s: %s must be subclass of %s",
 877                                  instance_klass()->external_name(), from_name->as_klass_external_name(),
 878                                  name->as_klass_external_name());
 879   }
 880 }
 881 
 882 int SharedDictionaryEntry::finalize_verification_constraints() {
 883   assert(DumpSharedSpaces, "called at dump time only");
 884   Thread* THREAD = Thread::current();
 885   ClassLoaderData* loader_data = ClassLoaderData::the_null_class_loader_data();
 886   GrowableArray<Symbol*>* vc_array = (GrowableArray<Symbol*>*)_verifier_constraints;
 887   GrowableArray<char>* vcflags_array = (GrowableArray<char>*)_verifier_constraint_flags;
 888 
 889   if (vc_array != NULL) {
 890     if (log_is_enabled(Trace, cds, verification)) {
 891       ResourceMark rm;
 892       log_trace(cds, verification)("finalize_verification_constraint: %s",
 893                                    literal()->external_name());
 894     }
 895 
 896     // Copy the constraints from C_HEAP-alloced GrowableArrays to Metaspace-alloced
 897     // Arrays
 898     int size = 0;
 899     {
 900       // FIXME: change this to be done after relocation, so we can use symbol offset??
 901       int length = vc_array->length();
 902       Array<Symbol*>* out = MetadataFactory::new_array<Symbol*>(loader_data, length, 0, THREAD);
 903       assert(out != NULL, "Dump time allocation failure would have aborted VM");
 904       for (int i=0; i<length; i++) {
 905         out->at_put(i, vc_array->at(i));
 906       }
 907       _verifier_constraints = out;
 908       size += out->size() * BytesPerWord;
 909       delete vc_array;
 910     }
 911     {
 912       int length = vcflags_array->length();
 913       Array<char>* out = MetadataFactory::new_array<char>(loader_data, length, 0, THREAD);
 914       assert(out != NULL, "Dump time allocation failure would have aborted VM");
 915       for (int i=0; i<length; i++) {
 916         out->at_put(i, vcflags_array->at(i));
 917       }
 918       _verifier_constraint_flags = out;
 919       size += out->size() * BytesPerWord;
 920       delete vcflags_array;
 921     }
 922 
 923     return size;
 924   }
 925   return 0;
 926 }
 927 
 928 void SharedDictionaryEntry::check_verification_constraints(InstanceKlass* klass, TRAPS) {
 929   Array<Symbol*>* vc_array = (Array<Symbol*>*)_verifier_constraints;
 930   Array<char>* vcflags_array = (Array<char>*)_verifier_constraint_flags;
 931 
 932   if (vc_array != NULL) {
 933     int length = vc_array->length();
 934     for (int i=0; i<length; i+=2) {
 935       Symbol* name      = vc_array->at(i);
 936       Symbol* from_name = vc_array->at(i+1);
 937       char c = vcflags_array->at(i/2);
 938 
 939       bool from_field_is_protected = (c & FROM_FIELD_IS_PROTECTED) ? true : false;
 940       bool from_is_array           = (c & FROM_IS_ARRAY)           ? true : false;
 941       bool from_is_object          = (c & FROM_IS_OBJECT)          ? true : false;
 942 
 943       bool ok = VerificationType::resolve_and_check_assignability(klass, name,
 944          from_name, from_field_is_protected, from_is_array, from_is_object, CHECK);
 945       if (!ok) {
 946         ResourceMark rm(THREAD);
 947         stringStream ss;
 948 
 949         ss.print_cr("Bad type on operand stack");
 950         ss.print_cr("Exception Details:");
 951         ss.print_cr("  Location:\n    %s", klass->name()->as_C_string());
 952         ss.print_cr("  Reason:\n    Type '%s' is not assignable to '%s'",
 953                     from_name->as_quoted_ascii(), name->as_quoted_ascii());
 954         THROW_MSG(vmSymbols::java_lang_VerifyError(), ss.as_string());
 955       }
 956     }
 957   }
 958 }
 959 
 960 void SharedDictionaryEntry::metaspace_pointers_do(MetaspaceClosure* it) {
 961   it->push((Array<Symbol*>**)&_verifier_constraints);
 962   it->push((Array<char>**)&_verifier_constraint_flags);
 963 }
 964 
 965 bool SharedDictionary::add_non_builtin_klass(const Symbol* class_name,
 966                                              ClassLoaderData* loader_data,
 967                                              InstanceKlass* klass) {
 968 
 969   assert(DumpSharedSpaces, "supported only when dumping");
 970   assert(klass != NULL, "adding NULL klass");
 971   assert(klass->name() == class_name, "sanity check on name");
 972   assert(klass->shared_classpath_index() < 0,
 973          "the shared classpath index should not be set for shared class loaded by the custom loaders");
 974 
 975   // Add an entry for a non-builtin class.
 976   // For a shared class for custom class loaders, SystemDictionary::resolve_or_null will
 977   // not find this class, because is_builtin() is false.
 978   unsigned int hash = compute_hash(class_name);
 979   int index = hash_to_index(hash);
 980 
 981   for (SharedDictionaryEntry* entry = bucket(index);
 982                               entry != NULL;
 983                               entry = entry->next()) {
 984     if (entry->hash() == hash) {
 985       Klass* klass = (Klass*)entry->literal();
 986       if (klass->name() == class_name && klass->class_loader_data() == loader_data) {
 987         // There is already a class defined with the same name
 988         return false;
 989       }
 990     }
 991   }
 992 
 993   assert(Dictionary::entry_size() >= sizeof(SharedDictionaryEntry), "must be big enough");
 994   SharedDictionaryEntry* entry = (SharedDictionaryEntry*)new_entry(hash, klass);
 995   add_entry(index, entry);
 996 
 997   assert(entry->is_unregistered(), "sanity");
 998   assert(!entry->is_builtin(), "sanity");
 999   return true;
1000 }
1001 
1002 
1003 //-----------------
1004 // SharedDictionary
1005 //-----------------
1006 
1007 
1008 Klass* SharedDictionary::find_class_for_builtin_loader(const Symbol* name) const {
1009   SharedDictionaryEntry* entry = get_entry_for_builtin_loader(name);
1010   return entry != NULL ? entry->instance_klass() : (Klass*)NULL;
1011 }
1012 
1013 Klass* SharedDictionary::find_class_for_unregistered_loader(const Symbol* name,
1014                                                             int clsfile_size,
1015                                                             int clsfile_crc32) const {
1016 
1017   const SharedDictionaryEntry* entry = get_entry_for_unregistered_loader(name,
1018                                                                          clsfile_size,
1019                                                                          clsfile_crc32);
1020   return entry != NULL ? entry->instance_klass() : (Klass*)NULL;
1021 }
1022 
1023 void SharedDictionary::update_entry(Klass* klass, int id) {
1024   assert(DumpSharedSpaces, "supported only when dumping");
1025   Symbol* class_name = klass->name();
1026   unsigned int hash = compute_hash(class_name);
1027   int index = hash_to_index(hash);
1028 
1029   for (SharedDictionaryEntry* entry = bucket(index);
1030                               entry != NULL;
1031                               entry = entry->next()) {
1032     if (entry->hash() == hash && entry->literal() == klass) {
1033       entry->_id = id;
1034       return;
1035     }
1036   }
1037 
1038   ShouldNotReachHere();
1039 }
1040 
1041 SharedDictionaryEntry* SharedDictionary::get_entry_for_builtin_loader(const Symbol* class_name) const {
1042   assert(!DumpSharedSpaces, "supported only when at runtime");
1043   unsigned int hash = compute_hash(class_name);
1044   const int index = hash_to_index(hash);
1045 
1046   for (SharedDictionaryEntry* entry = bucket(index);
1047                               entry != NULL;
1048                               entry = entry->next()) {
1049     if (entry->hash() == hash && entry->equals(class_name)) {
1050       if (entry->is_builtin()) {
1051         return entry;
1052       }
1053     }
1054   }
1055   return NULL;
1056 }
1057 
1058 SharedDictionaryEntry* SharedDictionary::get_entry_for_unregistered_loader(const Symbol* class_name,
1059                                                                            int clsfile_size,
1060                                                                            int clsfile_crc32) const {
1061   assert(!DumpSharedSpaces, "supported only when at runtime");
1062   unsigned int hash = compute_hash(class_name);
1063   int index = hash_to_index(hash);
1064 
1065   for (SharedDictionaryEntry* entry = bucket(index);
1066                               entry != NULL;
1067                               entry = entry->next()) {
1068     if (entry->hash() == hash && entry->equals(class_name)) {
1069       if (entry->is_unregistered()) {
1070         if (clsfile_size == -1) {
1071           // We're called from class_exists_for_unregistered_loader. At run time, we want to
1072           // compute the CRC of a ClassFileStream only if there is an UNREGISTERED class
1073           // with the matching name.
1074           return entry;
1075         } else {
1076           // We're called from find_class_for_unregistered_loader
1077           if (entry->_clsfile_size && clsfile_crc32 == entry->_clsfile_crc32) {
1078             return entry;
1079           }
1080         }
1081 
1082         // There can be only 1 class with this name for unregistered loaders.
1083         return NULL;
1084       }
1085     }
1086   }
1087   return NULL;
1088 }