summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/jni_internal.cc19
-rw-r--r--runtime/thread.cc2
2 files changed, 12 insertions, 9 deletions
diff --git a/runtime/jni_internal.cc b/runtime/jni_internal.cc
index 6690519eba..bbe5fda62f 100644
--- a/runtime/jni_internal.cc
+++ b/runtime/jni_internal.cc
@@ -844,13 +844,14 @@ class JNI {
}
static jobject NewGlobalRef(JNIEnv* env, jobject obj) {
- if (obj == NULL) {
- return NULL;
- }
ScopedObjectAccess soa(env);
+ Object* decoded_obj = soa.Decode<Object*>(obj);
+ // Check for null after decoding the object to handle cleared weak globals.
+ if (decoded_obj == nullptr) {
+ return nullptr;
+ }
JavaVMExt* vm = soa.Vm();
IndirectReferenceTable& globals = vm->globals;
- Object* decoded_obj = soa.Decode<Object*>(obj);
WriterMutexLock mu(soa.Self(), vm->globals_lock);
IndirectRef ref = globals.Add(IRT_FIRST_SEGMENT, decoded_obj);
return reinterpret_cast<jobject>(ref);
@@ -884,11 +885,13 @@ class JNI {
}
static jobject NewLocalRef(JNIEnv* env, jobject obj) {
- if (obj == NULL) {
- return NULL;
- }
ScopedObjectAccess soa(env);
- return soa.AddLocalReference<jobject>(soa.Decode<Object*>(obj));
+ mirror::Object* decoded_obj = soa.Decode<Object*>(obj);
+ // Check for null after decoding the object to handle cleared weak globals.
+ if (decoded_obj == nullptr) {
+ return nullptr;
+ }
+ return soa.AddLocalReference<jobject>(decoded_obj);
}
static void DeleteLocalRef(JNIEnv* env, jobject obj) {
diff --git a/runtime/thread.cc b/runtime/thread.cc
index bc252deecc..9faa60dbf8 100644
--- a/runtime/thread.cc
+++ b/runtime/thread.cc
@@ -1147,7 +1147,7 @@ mirror::Object* Thread::DecodeJObject(jobject obj) const {
result = Runtime::Current()->GetJavaVM()->DecodeWeakGlobal(const_cast<Thread*>(this), ref);
if (result == kClearedJniWeakGlobal) {
// This is a special case where it's okay to return NULL.
- return NULL;
+ return nullptr;
}
}