summaryrefslogtreecommitdiffstats
path: root/runtime/reflection.cc
diff options
context:
space:
mode:
authorMathieu Chartier <mathieuc@google.com>2015-04-23 16:32:54 -0700
committerMathieu Chartier <mathieuc@google.com>2015-04-23 17:21:26 -0700
commita61894d88fabe45677f491c9f6bde30059a49026 (patch)
treeb9d8b09e5f90792867b6720a1fb4ab5c76cdfa5f /runtime/reflection.cc
parent4ceed922d44b68c3fa7cbe670014c9e2e003b92b (diff)
downloadart-a61894d88fabe45677f491c9f6bde30059a49026.tar.gz
art-a61894d88fabe45677f491c9f6bde30059a49026.tar.bz2
art-a61894d88fabe45677f491c9f6bde30059a49026.zip
Fix reflection handling and test flakiness
Fixed reflection invoke to handle exceptions which occur from FindClass or NewObject by throwing these instead of the expected InvocationTargetException. Added test case to 080 for this reflection invoke. Fixed println throwing OOM in 104-growth-limit. Change-Id: I65766e7c3478e299da06fdc3a521fe3f3e8fdba9
Diffstat (limited to 'runtime/reflection.cc')
-rw-r--r--runtime/reflection.cc12
1 files changed, 11 insertions, 1 deletions
diff --git a/runtime/reflection.cc b/runtime/reflection.cc
index e54673831f..3099094ed4 100644
--- a/runtime/reflection.cc
+++ b/runtime/reflection.cc
@@ -615,11 +615,21 @@ jobject InvokeMethod(const ScopedObjectAccessAlreadyRunnable& soa, jobject javaM
// Wrap any exception with "Ljava/lang/reflect/InvocationTargetException;" and return early.
if (soa.Self()->IsExceptionPending()) {
+ // If we get another exception when we are trying to wrap, then just use that instead.
jthrowable th = soa.Env()->ExceptionOccurred();
- soa.Env()->ExceptionClear();
+ soa.Self()->ClearException();
jclass exception_class = soa.Env()->FindClass("java/lang/reflect/InvocationTargetException");
+ if (exception_class == nullptr) {
+ soa.Self()->AssertPendingOOMException();
+ return nullptr;
+ }
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);
+ if (exception_instance == nullptr) {
+ soa.Self()->AssertPendingOOMException();
+ return nullptr;
+ }
soa.Env()->Throw(reinterpret_cast<jthrowable>(exception_instance));
return nullptr;
}