OSDN Git Service

ART: Fix unstarted runtime
authorAndreas Gampe <agampe@google.com>
Wed, 1 Apr 2015 21:49:06 +0000 (14:49 -0700)
committerAndreas Gampe <agampe@google.com>
Wed, 1 Apr 2015 21:49:06 +0000 (14:49 -0700)
Correctly delete local refs for dex/direct-byte-buffer.

Change-Id: Ia74dfafb959d69aa281af7316f393997e053a3b3

runtime/interpreter/unstarted_runtime.cc

index 1b08e80..281f332 100644 (file)
@@ -19,6 +19,8 @@
 #include <cmath>
 #include <unordered_map>
 
+#include "ScopedLocalRef.h"
+
 #include "base/logging.h"
 #include "base/macros.h"
 #include "class_linker.h"
@@ -467,18 +469,21 @@ static mirror::Object* GetDexFromDexCache(Thread* self, mirror::DexCache* dex_ca
   JNIEnv* env = self->GetJniEnv();
   DCHECK(env != nullptr);
   void* address = const_cast<void*>(reinterpret_cast<const void*>(dex_file->Begin()));
-  jobject byte_buffer = env->NewDirectByteBuffer(address, dex_file->Size());
-  if (byte_buffer == nullptr) {
+  ScopedLocalRef<jobject> byte_buffer(env, env->NewDirectByteBuffer(address, dex_file->Size()));
+  if (byte_buffer.get() == nullptr) {
     DCHECK(self->IsExceptionPending());
     return nullptr;
   }
 
   jvalue args[1];
-  args[0].l = byte_buffer;
-  return self->DecodeJObject(
-      env->CallStaticObjectMethodA(WellKnownClasses::com_android_dex_Dex,
-                                   WellKnownClasses::com_android_dex_Dex_create,
-                                   args));
+  args[0].l = byte_buffer.get();
+
+  ScopedLocalRef<jobject> dex(env, env->CallStaticObjectMethodA(
+      WellKnownClasses::com_android_dex_Dex,
+      WellKnownClasses::com_android_dex_Dex_create,
+      args));
+
+  return self->DecodeJObject(dex.get());
 }
 
 static void UnstartedDexCacheGetDexNative(