JNI: Fix local reference leak for exceptional path.
Test: m test-art-host-gtest
Test: testrunner.py --host --optimizing
Change-Id: Iba759e5729c86ad738b3f700609ef7211abb6829
diff --git a/runtime/jni/jni_internal.cc b/runtime/jni/jni_internal.cc
index 33eb4b6..33b6e04 100644
--- a/runtime/jni/jni_internal.cc
+++ b/runtime/jni/jni_internal.cc
@@ -955,16 +955,15 @@
WellKnownClasses::StringInitToStringFactory(jni::DecodeArtMethod(mid)));
return CallStaticObjectMethodV(env, WellKnownClasses::java_lang_StringFactory, sf_mid, args);
}
- ObjPtr<mirror::Object> result = c->AllocObject(soa.Self());
+ ScopedLocalRef<jobject> result(env, soa.AddLocalReference<jobject>(c->AllocObject(soa.Self())));
if (result == nullptr) {
return nullptr;
}
- jobject local_result = soa.AddLocalReference<jobject>(result);
- CallNonvirtualVoidMethodV(env, local_result, java_class, mid, args);
+ CallNonvirtualVoidMethodV(env, result.get(), java_class, mid, args);
if (soa.Self()->IsExceptionPending()) {
return nullptr;
}
- return local_result;
+ return result.release();
}
static jobject NewObjectA(JNIEnv* env, jclass java_class, jmethodID mid, const jvalue* args) {
@@ -982,16 +981,15 @@
WellKnownClasses::StringInitToStringFactory(jni::DecodeArtMethod(mid)));
return CallStaticObjectMethodA(env, WellKnownClasses::java_lang_StringFactory, sf_mid, args);
}
- ObjPtr<mirror::Object> result = c->AllocObject(soa.Self());
+ ScopedLocalRef<jobject> result(env, soa.AddLocalReference<jobject>(c->AllocObject(soa.Self())));
if (result == nullptr) {
return nullptr;
}
- jobject local_result = soa.AddLocalReference<jobjectArray>(result);
- CallNonvirtualVoidMethodA(env, local_result, java_class, mid, args);
+ CallNonvirtualVoidMethodA(env, result.get(), java_class, mid, args);
if (soa.Self()->IsExceptionPending()) {
return nullptr;
}
- return local_result;
+ return result.release();
}
static jmethodID GetMethodID(JNIEnv* env, jclass java_class, const char* name, const char* sig) {
@@ -1270,8 +1268,7 @@
CHECK_NON_NULL_ARGUMENT(mid);
ScopedObjectAccess soa(env);
JValue result(InvokeWithVarArgs(soa, obj, mid, ap));
- jobject local_result = soa.AddLocalReference<jobject>(result.GetL());
- return local_result;
+ return soa.AddLocalReference<jobject>(result.GetL());
}
static jobject CallNonvirtualObjectMethodV(JNIEnv* env, jobject obj, jclass, jmethodID mid,
@@ -1757,8 +1754,7 @@
CHECK_NON_NULL_ARGUMENT(mid);
ScopedObjectAccess soa(env);
JValue result(InvokeWithVarArgs(soa, nullptr, mid, ap));
- jobject local_result = soa.AddLocalReference<jobject>(result.GetL());
- return local_result;
+ return soa.AddLocalReference<jobject>(result.GetL());
}
static jobject CallStaticObjectMethodV(JNIEnv* env, jclass, jmethodID mid, va_list args) {