diff options
| author | 2016-06-08 04:03:56 +0000 | |
|---|---|---|
| committer | 2016-06-08 04:03:56 +0000 | |
| commit | 923b26fb78b1dfb0054aad39f9ff5d6546e4979c (patch) | |
| tree | 12678002742b30b5e692d5887bab038331ffb0fe /runtime/native/java_lang_VMClassLoader.cc | |
| parent | 06fead330f66f3a3ec19cf5b466ca848482d16bf (diff) | |
| parent | c92a7a14ce44c4bb7e63e4c447a008b558bc0bca (diff) | |
Merge "Wrap certain exception types when loading an erroneous class."
Diffstat (limited to 'runtime/native/java_lang_VMClassLoader.cc')
| -rw-r--r-- | runtime/native/java_lang_VMClassLoader.cc | 17 | 
1 files changed, 17 insertions, 0 deletions
diff --git a/runtime/native/java_lang_VMClassLoader.cc b/runtime/native/java_lang_VMClassLoader.cc index 15156301c8..6f735aa6df 100644 --- a/runtime/native/java_lang_VMClassLoader.cc +++ b/runtime/native/java_lang_VMClassLoader.cc @@ -41,6 +41,23 @@ static jclass VMClassLoader_findLoadedClass(JNIEnv* env, jclass, jobject javaLoa    if (c != nullptr && c->IsResolved()) {      return soa.AddLocalReference<jclass>(c);    } +  // If class is erroneous, throw the earlier failure, wrapped in certain cases. See b/28787733. +  if (c != nullptr && c->IsErroneous()) { +    cl->ThrowEarlierClassFailure(c); +    Thread* self = soa.Self(); +    mirror::Class* eiie_class = +        self->DecodeJObject(WellKnownClasses::java_lang_ExceptionInInitializerError)->AsClass(); +    mirror::Class* iae_class = +        self->DecodeJObject(WellKnownClasses::java_lang_IllegalAccessError)->AsClass(); +    mirror::Class* ncdfe_class = +        self->DecodeJObject(WellKnownClasses::java_lang_NoClassDefFoundError)->AsClass(); +    mirror::Class* exception = self->GetException()->GetClass(); +    if (exception == eiie_class || exception == iae_class || exception == ncdfe_class) { +      self->ThrowNewWrappedException("Ljava/lang/ClassNotFoundException;", +                                     PrettyDescriptor(c).c_str()); +    } +    return nullptr; +  }    if (loader != nullptr) {      // Try the common case.      StackHandleScope<1> hs(soa.Self());  |