hotspot/src/share/vm/oops/instanceKlass.cpp
changeset 42031 55dc92f033b9
parent 41669 2091069b6851
child 42636 aafc434ba580
child 42307 cefc81dc1d52
--- a/hotspot/src/share/vm/oops/instanceKlass.cpp	Thu Oct 20 16:53:39 2016 +0300
+++ b/hotspot/src/share/vm/oops/instanceKlass.cpp	Thu Oct 20 13:41:07 2016 -0700
@@ -517,12 +517,14 @@
 
 bool InstanceKlass::link_class_impl(
     instanceKlassHandle this_k, bool throw_verifyerror, TRAPS) {
-  // check for error state.
-  // This is checking for the wrong state.  If the state is initialization_error,
-  // then this class *was* linked.  The CDS code does a try_link_class and uses
-  // initialization_error to mark classes to not include in the archive during
-  // DumpSharedSpaces.  This should be removed when the CDS bug is fixed.
-  if (this_k->is_in_error_state()) {
+  if (DumpSharedSpaces && this_k->is_in_error_state()) {
+    // This is for CDS dumping phase only -- we use the in_error_state to indicate that
+    // the class has failed verification. Throwing the NoClassDefFoundError here is just
+    // a convenient way to stop repeat attempts to verify the same (bad) class.
+    //
+    // Note that the NoClassDefFoundError is not part of the JLS, and should not be thrown
+    // if we are executing Java code. This is not a problem for CDS dumping phase since
+    // it doesn't execute any Java code.
     ResourceMark rm(THREAD);
     THROW_MSG_(vmSymbols::java_lang_NoClassDefFoundError(),
                this_k->external_name(), false);