diff options
Diffstat (limited to 'runtime/native/java_lang_Class.cc')
-rw-r--r-- | runtime/native/java_lang_Class.cc | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/runtime/native/java_lang_Class.cc b/runtime/native/java_lang_Class.cc index a861f25fab..fb48bb8d3c 100644 --- a/runtime/native/java_lang_Class.cc +++ b/runtime/native/java_lang_Class.cc @@ -19,7 +19,7 @@ #include <iostream> #include "art_field-inl.h" -#include "art_method-inl.h" +#include "art_method-alloc-inl.h" #include "base/enums.h" #include "class_linker-inl.h" #include "class_root-inl.h" @@ -54,7 +54,7 @@ #include "reflective_handle_scope-inl.h" #include "scoped_fast_native_object_access-inl.h" #include "scoped_thread_state_change-inl.h" -#include "well_known_classes.h" +#include "well_known_classes-inl.h" namespace art { @@ -90,14 +90,17 @@ ALWAYS_INLINE static inline ObjPtr<mirror::Class> DecodeClass( static jclass Class_classForName(JNIEnv* env, jclass, jstring javaName, jboolean initialize, jobject javaLoader) { ScopedFastNativeObjectAccess soa(env); - ScopedUtfChars name(env, javaName); - if (name.c_str() == nullptr) { + StackHandleScope<3> hs(soa.Self()); + Handle<mirror::String> mirror_name = hs.NewHandle(soa.Decode<mirror::String>(javaName)); + if (mirror_name == nullptr) { + soa.Self()->ThrowNewWrappedException("Ljava/lang/NullPointerException;", /*msg=*/ nullptr); return nullptr; } // We need to validate and convert the name (from x.y.z to x/y/z). This // is especially handy for array types, since we want to avoid // auto-generating bogus array classes. + std::string name = mirror_name->ToModifiedUtf8(); if (!IsValidBinaryClassName(name.c_str())) { soa.Self()->ThrowNewExceptionF("Ljava/lang/ClassNotFoundException;", "Invalid name: %s", name.c_str()); @@ -105,23 +108,21 @@ static jclass Class_classForName(JNIEnv* env, jclass, jstring javaName, jboolean } std::string descriptor(DotToDescriptor(name.c_str())); - StackHandleScope<2> hs(soa.Self()); Handle<mirror::ClassLoader> class_loader( hs.NewHandle(soa.Decode<mirror::ClassLoader>(javaLoader))); ClassLinker* class_linker = Runtime::Current()->GetClassLinker(); Handle<mirror::Class> c( hs.NewHandle(class_linker->FindClass(soa.Self(), descriptor.c_str(), class_loader))); - if (c == nullptr) { - ScopedLocalRef<jthrowable> cause(env, env->ExceptionOccurred()); - env->ExceptionClear(); - jthrowable cnfe = reinterpret_cast<jthrowable>( - env->NewObject(WellKnownClasses::java_lang_ClassNotFoundException, - WellKnownClasses::java_lang_ClassNotFoundException_init, - javaName, - cause.get())); + if (UNLIKELY(c == nullptr)) { + StackHandleScope<2> hs2(soa.Self()); + Handle<mirror::Object> cause = hs2.NewHandle(soa.Self()->GetException()); + soa.Self()->ClearException(); + Handle<mirror::Object> cnfe = + WellKnownClasses::java_lang_ClassNotFoundException_init->NewObject<'L', 'L'>( + hs2, soa.Self(), mirror_name, cause); if (cnfe != nullptr) { // Make sure allocation didn't fail with an OOME. - env->Throw(cnfe); + soa.Self()->SetException(ObjPtr<mirror::Throwable>::DownCast(cnfe.Get())); } return nullptr; } |