diff options
author | 2019-06-24 13:30:42 -0700 | |
---|---|---|
committer | 2019-06-24 13:46:30 -0700 | |
commit | f284a2d185ef4b45e3e794fa29eb78707f398bf1 (patch) | |
tree | 585e212811af634d44082ae5eaee845f85fd1596 | |
parent | 00a37fff76278cd19cf59568df87495f6663c4b6 (diff) |
Add InvocationTargetException to Wellknownclasses
To simplify reflection code and eliminate a possible infinite loop
issue if encoding a jmethodID takes memory I added
j.l.r.InvocationTargetException and its constructor to
WellKnownClasses.
Test: ./test.py --host
Bug: 134162467
Change-Id: I77d3905e8e738820c9451decb88ac39df6fcefa7
-rw-r--r-- | runtime/reflection.cc | 12 | ||||
-rw-r--r-- | runtime/well_known_classes.cc | 6 | ||||
-rw-r--r-- | runtime/well_known_classes.h | 2 |
3 files changed, 12 insertions, 8 deletions
diff --git a/runtime/reflection.cc b/runtime/reflection.cc index 0dbec85c02..edd92da65c 100644 --- a/runtime/reflection.cc +++ b/runtime/reflection.cc @@ -497,14 +497,10 @@ bool InvokeMethodImpl(const ScopedObjectAccessAlreadyRunnable& soa, // If we get another exception when we are trying to wrap, then just use that instead. ScopedLocalRef<jthrowable> th(soa.Env(), soa.Env()->ExceptionOccurred()); soa.Self()->ClearException(); - jclass exception_class = soa.Env()->FindClass("java/lang/reflect/InvocationTargetException"); - if (exception_class == nullptr) { - soa.Self()->AssertPendingException(); - return false; - } - jmethodID mid = soa.Env()->GetMethodID(exception_class, "<init>", "(Ljava/lang/Throwable;)V"); - CHECK(mid != nullptr); - jobject exception_instance = soa.Env()->NewObject(exception_class, mid, th.get()); + jobject exception_instance = + soa.Env()->NewObject(WellKnownClasses::java_lang_reflect_InvocationTargetException, + WellKnownClasses::java_lang_reflect_InvocationTargetException_init, + th.get()); if (exception_instance == nullptr) { soa.Self()->AssertPendingException(); return false; diff --git a/runtime/well_known_classes.cc b/runtime/well_known_classes.cc index db90ae82cf..279b45b755 100644 --- a/runtime/well_known_classes.cc +++ b/runtime/well_known_classes.cc @@ -61,6 +61,7 @@ jclass WellKnownClasses::java_lang_IllegalAccessError; jclass WellKnownClasses::java_lang_NoClassDefFoundError; jclass WellKnownClasses::java_lang_Object; jclass WellKnownClasses::java_lang_OutOfMemoryError; +jclass WellKnownClasses::java_lang_reflect_InvocationTargetException; jclass WellKnownClasses::java_lang_reflect_Parameter; jclass WellKnownClasses::java_lang_reflect_Parameter__array; jclass WellKnownClasses::java_lang_reflect_Proxy; @@ -101,6 +102,7 @@ jmethodID WellKnownClasses::java_lang_invoke_MethodHandles_Lookup_findConstructo jmethodID WellKnownClasses::java_lang_Long_valueOf; jmethodID WellKnownClasses::java_lang_ref_FinalizerReference_add; jmethodID WellKnownClasses::java_lang_ref_ReferenceQueue_add; +jmethodID WellKnownClasses::java_lang_reflect_InvocationTargetException_init; jmethodID WellKnownClasses::java_lang_reflect_Parameter_init; jmethodID WellKnownClasses::java_lang_reflect_Proxy_init; jmethodID WellKnownClasses::java_lang_reflect_Proxy_invoke; @@ -324,6 +326,7 @@ void WellKnownClasses::Init(JNIEnv* env) { java_lang_Error = CacheClass(env, "java/lang/Error"); java_lang_IllegalAccessError = CacheClass(env, "java/lang/IllegalAccessError"); java_lang_NoClassDefFoundError = CacheClass(env, "java/lang/NoClassDefFoundError"); + java_lang_reflect_InvocationTargetException = CacheClass(env, "java/lang/reflect/InvocationTargetException"); java_lang_reflect_Parameter = CacheClass(env, "java/lang/reflect/Parameter"); java_lang_reflect_Parameter__array = CacheClass(env, "[Ljava/lang/reflect/Parameter;"); java_lang_reflect_Proxy = CacheClass(env, "java/lang/reflect/Proxy"); @@ -360,6 +363,7 @@ void WellKnownClasses::Init(JNIEnv* env) { java_lang_ref_FinalizerReference_add = CacheMethod(env, "java/lang/ref/FinalizerReference", true, "add", "(Ljava/lang/Object;)V"); java_lang_ref_ReferenceQueue_add = CacheMethod(env, "java/lang/ref/ReferenceQueue", true, "add", "(Ljava/lang/ref/Reference;)V"); + java_lang_reflect_InvocationTargetException_init = CacheMethod(env, java_lang_reflect_InvocationTargetException, false, "<init>", "(Ljava/lang/Throwable;)V"); java_lang_reflect_Parameter_init = CacheMethod(env, java_lang_reflect_Parameter, false, "<init>", "(Ljava/lang/String;ILjava/lang/reflect/Executable;I)V"); java_lang_String_charAt = CacheMethod(env, java_lang_String, false, "charAt", "(I)C"); java_lang_Thread_dispatchUncaughtException = CacheMethod(env, java_lang_Thread, false, "dispatchUncaughtException", "(Ljava/lang/Throwable;)V"); @@ -470,6 +474,7 @@ void WellKnownClasses::Clear() { java_lang_NoClassDefFoundError = nullptr; java_lang_Object = nullptr; java_lang_OutOfMemoryError = nullptr; + java_lang_reflect_InvocationTargetException = nullptr; java_lang_reflect_Parameter = nullptr; java_lang_reflect_Parameter__array = nullptr; java_lang_reflect_Proxy = nullptr; @@ -508,6 +513,7 @@ void WellKnownClasses::Clear() { java_lang_Long_valueOf = nullptr; java_lang_ref_FinalizerReference_add = nullptr; java_lang_ref_ReferenceQueue_add = nullptr; + java_lang_reflect_InvocationTargetException_init = nullptr; java_lang_reflect_Parameter_init = nullptr; java_lang_reflect_Proxy_init = nullptr; java_lang_reflect_Proxy_invoke = nullptr; diff --git a/runtime/well_known_classes.h b/runtime/well_known_classes.h index 3c5144fbd5..d7acd5789f 100644 --- a/runtime/well_known_classes.h +++ b/runtime/well_known_classes.h @@ -70,6 +70,7 @@ struct WellKnownClasses { static jclass java_lang_NoClassDefFoundError; static jclass java_lang_Object; static jclass java_lang_OutOfMemoryError; + static jclass java_lang_reflect_InvocationTargetException; static jclass java_lang_reflect_Parameter; static jclass java_lang_reflect_Parameter__array; static jclass java_lang_reflect_Proxy; @@ -110,6 +111,7 @@ struct WellKnownClasses { static jmethodID java_lang_Long_valueOf; static jmethodID java_lang_ref_FinalizerReference_add; static jmethodID java_lang_ref_ReferenceQueue_add; + static jmethodID java_lang_reflect_InvocationTargetException_init; static jmethodID java_lang_reflect_Parameter_init; static jmethodID java_lang_reflect_Proxy_init; static jmethodID java_lang_reflect_Proxy_invoke; |