mirror of
https://github.com/openjdk/jdk.git
synced 2026-03-17 19:33:18 +00:00
8166203: NoClassDefFoundError should not be thrown if class is in_error_state at link time
Reviewed-by: coleenp, dholmes, sspitsyn
This commit is contained in:
parent
9577d94f76
commit
1f18dde1d8
@ -517,12 +517,14 @@ bool InstanceKlass::link_class_or_fail(TRAPS) {
|
||||
|
||||
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);
|
||||
|
||||
@ -88,9 +88,7 @@ public class InterfaceInitializationStates {
|
||||
// Iunlinked is testing initialization like interface I, except interface I is linked when
|
||||
// ClassLIM is linked.
|
||||
// Iunlinked is not linked already when K gets an initialization error. Linking Iunlinked
|
||||
// should succeed and not get NoClassDefFoundError because it does not depend on the
|
||||
// initialization state of K for linking. There's bug now where it gets this error.
|
||||
// See: https://bugs.openjdk.java.net/browse/JDK-8166203.
|
||||
// should succeed because it does not depend on the initialization state of K for linking.
|
||||
interface Iunlinked extends K {
|
||||
boolean v = InterfaceInitializationStates.out(Iunlinked.class);
|
||||
}
|
||||
@ -157,15 +155,9 @@ public class InterfaceInitializationStates {
|
||||
System.out.println("ExceptionInInitializerError as expected");
|
||||
}
|
||||
|
||||
// Initialize Iunlinked. This should not get NoClassDefFoundError because K
|
||||
// Initialize Iunlinked. No exception should be thrown even if K
|
||||
// (its super interface) is in initialization_error state.
|
||||
// This is a bug. It does now.
|
||||
try {
|
||||
boolean bb = Iunlinked.v;
|
||||
throw new RuntimeException("FAIL exception not thrown for Iunlinked initialization");
|
||||
} catch(NoClassDefFoundError e) {
|
||||
System.out.println("NoClassDefFoundError thrown because of bug");
|
||||
}
|
||||
boolean bb = Iunlinked.v;
|
||||
|
||||
// This should be okay
|
||||
boolean value = Iparams.v;
|
||||
@ -182,7 +174,7 @@ public class InterfaceInitializationStates {
|
||||
|
||||
// Check expected class initialization order
|
||||
List<Class<?>> expectedCInitOrder = Arrays.asList(L.class, K.class, M.class, ClassM.class,
|
||||
I.class, Iparams.class,
|
||||
I.class, Iunlinked.class, Iparams.class,
|
||||
ClassIparams.class);
|
||||
if (!cInitOrder.equals(expectedCInitOrder)) {
|
||||
throw new RuntimeException(
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user