diff options
| author | 2016-11-08 23:21:21 +0000 | |
|---|---|---|
| committer | 2016-11-08 23:21:21 +0000 | |
| commit | 89269b6f6ab24eaa3c5ab87c2fb197c335584bd6 (patch) | |
| tree | 4d4028ddadf227ebbbe739fe466862b627591844 | |
| parent | da40ac056c8f8913cc1168cf0a0215ec992cd60c (diff) | |
| parent | 08883debd927d18c9ecf66683a2a11aa98165656 (diff) | |
Merge "ART: Refactor jfieldID handling"
| -rw-r--r-- | runtime/check_jni.cc | 15 | ||||
| -rw-r--r-- | runtime/class_linker.cc | 37 | ||||
| -rw-r--r-- | runtime/common_runtime_test.cc | 12 | ||||
| -rw-r--r-- | runtime/debugger.cc | 27 | ||||
| -rw-r--r-- | runtime/jni_internal.cc | 22 | ||||
| -rw-r--r-- | runtime/jni_internal.h | 11 | ||||
| -rw-r--r-- | runtime/oat_file_manager.cc | 22 | ||||
| -rw-r--r-- | runtime/scoped_thread_state_change-inl.h | 12 | ||||
| -rw-r--r-- | runtime/scoped_thread_state_change.h | 4 | ||||
| -rw-r--r-- | runtime/thread.cc | 41 | ||||
| -rw-r--r-- | runtime/thread.h | 3 |
11 files changed, 101 insertions, 105 deletions
diff --git a/runtime/check_jni.cc b/runtime/check_jni.cc index 7d6cee91f2..6c27bc61e4 100644 --- a/runtime/check_jni.cc +++ b/runtime/check_jni.cc @@ -282,7 +282,7 @@ class ScopedCheck { return false; } - ArtField* f = CheckFieldID(soa, fid); + ArtField* f = CheckFieldID(fid); if (f == nullptr) { return false; } @@ -362,7 +362,7 @@ class ScopedCheck { bool CheckStaticFieldID(ScopedObjectAccess& soa, jclass java_class, jfieldID fid) REQUIRES_SHARED(Locks::mutator_lock_) { ObjPtr<mirror::Class> c = soa.Decode<mirror::Class>(java_class); - ArtField* f = CheckFieldID(soa, fid); + ArtField* f = CheckFieldID(fid); if (f == nullptr) { return false; } @@ -681,7 +681,7 @@ class ScopedCheck { if (!is_static && !CheckInstanceFieldID(soa, obj, fid)) { return false; } - ArtField* field = soa.DecodeField(fid); + ArtField* field = jni::DecodeArtField(fid); DCHECK(field != nullptr); // Already checked by Check. if (is_static != field->IsStatic()) { AbortF("attempt to access %s field %s: %p", @@ -843,7 +843,7 @@ class ScopedCheck { case 'c': // jclass return CheckInstance(soa, kClass, arg.c, false); case 'f': // jfieldID - return CheckFieldID(soa, arg.f) != nullptr; + return CheckFieldID(arg.f) != nullptr; case 'm': // jmethodID return CheckMethodID(arg.m) != nullptr; case 'r': // release int @@ -961,7 +961,7 @@ class ScopedCheck { } case 'f': { // jfieldID jfieldID fid = arg.f; - ArtField* f = soa.DecodeField(fid); + ArtField* f = jni::DecodeArtField(fid); *msg += ArtField::PrettyField(f); if (!entry) { StringAppendF(msg, " (%p)", fid); @@ -1146,13 +1146,12 @@ class ScopedCheck { return true; } - ArtField* CheckFieldID(ScopedObjectAccess& soa, jfieldID fid) - REQUIRES_SHARED(Locks::mutator_lock_) { + ArtField* CheckFieldID(jfieldID fid) REQUIRES_SHARED(Locks::mutator_lock_) { if (fid == nullptr) { AbortF("jfieldID was NULL"); return nullptr; } - ArtField* f = soa.DecodeField(fid); + ArtField* f = jni::DecodeArtField(fid); // TODO: Better check here. if (!Runtime::Current()->GetHeap()->IsValidObjectAddress(f->GetDeclaringClass().Ptr())) { Runtime::Current()->GetHeap()->DumpSpaces(LOG_STREAM(ERROR)); diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc index e7e5be7b75..6d45dad28f 100644 --- a/runtime/class_linker.cc +++ b/runtime/class_linker.cc @@ -63,6 +63,7 @@ #include "jit/jit.h" #include "jit/jit_code_cache.h" #include "jit/offline_profiling_info.h" +#include "jni_internal.h" #include "leb128.h" #include "linear_alloc.h" #include "mirror/class.h" @@ -1124,13 +1125,12 @@ bool ClassLinker::IsBootClassLoader(ScopedObjectAccessAlreadyRunnable& soa, class_loader->GetClass(); } -static mirror::String* GetDexPathListElementName(ScopedObjectAccessUnchecked& soa, - ObjPtr<mirror::Object> element) +static mirror::String* GetDexPathListElementName(ObjPtr<mirror::Object> element) REQUIRES_SHARED(Locks::mutator_lock_) { ArtField* const dex_file_field = - soa.DecodeField(WellKnownClasses::dalvik_system_DexPathList__Element_dexFile); + jni::DecodeArtField(WellKnownClasses::dalvik_system_DexPathList__Element_dexFile); ArtField* const dex_file_name_field = - soa.DecodeField(WellKnownClasses::dalvik_system_DexFile_fileName); + jni::DecodeArtField(WellKnownClasses::dalvik_system_DexFile_fileName); DCHECK(dex_file_field != nullptr); DCHECK(dex_file_name_field != nullptr); DCHECK(element != nullptr); @@ -1154,9 +1154,9 @@ static bool FlattenPathClassLoader(ObjPtr<mirror::ClassLoader> class_loader, DCHECK(error_msg != nullptr); ScopedObjectAccessUnchecked soa(Thread::Current()); ArtField* const dex_path_list_field = - soa.DecodeField(WellKnownClasses::dalvik_system_BaseDexClassLoader_pathList); + jni::DecodeArtField(WellKnownClasses::dalvik_system_BaseDexClassLoader_pathList); ArtField* const dex_elements_field = - soa.DecodeField(WellKnownClasses::dalvik_system_DexPathList_dexElements); + jni::DecodeArtField(WellKnownClasses::dalvik_system_DexPathList_dexElements); CHECK(dex_path_list_field != nullptr); CHECK(dex_elements_field != nullptr); while (!ClassLinker::IsBootClassLoader(soa, class_loader)) { @@ -1183,7 +1183,7 @@ static bool FlattenPathClassLoader(ObjPtr<mirror::ClassLoader> class_loader, *error_msg = StringPrintf("Null dex element at index %d", i); return false; } - ObjPtr<mirror::String> const name = GetDexPathListElementName(soa, element); + ObjPtr<mirror::String> const name = GetDexPathListElementName(element); if (name == nullptr) { *error_msg = StringPrintf("Null name for dex element at index %d", i); return false; @@ -1733,7 +1733,7 @@ bool ClassLinker::AddImageSpace( ObjPtr<mirror::Object> element = elements->GetWithoutChecks(i); if (element != nullptr) { // If we are somewhere in the middle of the array, there may be nulls at the end. - loader_dex_file_names.push_back(GetDexPathListElementName(soa, element)); + loader_dex_file_names.push_back(GetDexPathListElementName(element)); } } // Ignore the number of image dex files since we are adding those to the class loader anyways. @@ -2425,16 +2425,17 @@ bool ClassLinker::FindClassInBaseDexClassLoader(ScopedObjectAccessAlreadyRunnabl // Handle as if this is the child PathClassLoader. // The class loader is a PathClassLoader which inherits from BaseDexClassLoader. // We need to get the DexPathList and loop through it. - ArtField* const cookie_field = soa.DecodeField(WellKnownClasses::dalvik_system_DexFile_cookie); + ArtField* const cookie_field = + jni::DecodeArtField(WellKnownClasses::dalvik_system_DexFile_cookie); ArtField* const dex_file_field = - soa.DecodeField(WellKnownClasses::dalvik_system_DexPathList__Element_dexFile); + jni::DecodeArtField(WellKnownClasses::dalvik_system_DexPathList__Element_dexFile); ObjPtr<mirror::Object> dex_path_list = - soa.DecodeField(WellKnownClasses::dalvik_system_BaseDexClassLoader_pathList)-> - GetObject(class_loader.Get()); + jni::DecodeArtField(WellKnownClasses::dalvik_system_BaseDexClassLoader_pathList)-> + GetObject(class_loader.Get()); if (dex_path_list != nullptr && dex_file_field != nullptr && cookie_field != nullptr) { // DexPathList has an array dexElements of Elements[] which each contain a dex file. ObjPtr<mirror::Object> dex_elements_obj = - soa.DecodeField(WellKnownClasses::dalvik_system_DexPathList_dexElements)-> + jni::DecodeArtField(WellKnownClasses::dalvik_system_DexPathList_dexElements)-> GetObject(dex_path_list); // Loop through each dalvik.system.DexPathList$Element's dalvik.system.DexFile and look // at the mCookie which is a DexFile vector. @@ -8137,7 +8138,7 @@ jobject ClassLinker::CreatePathClassLoader(Thread* self, StackHandleScope<11> hs(self); ArtField* dex_elements_field = - soa.DecodeField(WellKnownClasses::dalvik_system_DexPathList_dexElements); + jni::DecodeArtField(WellKnownClasses::dalvik_system_DexPathList_dexElements); Handle<mirror::Class> dex_elements_class(hs.NewHandle(dex_elements_field->GetType<true>())); DCHECK(dex_elements_class.Get() != nullptr); @@ -8150,13 +8151,13 @@ jobject ClassLinker::CreatePathClassLoader(Thread* self, hs.NewHandle(dex_elements_class->GetComponentType()); ArtField* element_file_field = - soa.DecodeField(WellKnownClasses::dalvik_system_DexPathList__Element_dexFile); + jni::DecodeArtField(WellKnownClasses::dalvik_system_DexPathList__Element_dexFile); DCHECK_EQ(h_dex_element_class.Get(), element_file_field->GetDeclaringClass()); - ArtField* cookie_field = soa.DecodeField(WellKnownClasses::dalvik_system_DexFile_cookie); + ArtField* cookie_field = jni::DecodeArtField(WellKnownClasses::dalvik_system_DexFile_cookie); DCHECK_EQ(cookie_field->GetDeclaringClass(), element_file_field->GetType<false>()); - ArtField* file_name_field = soa.DecodeField(WellKnownClasses::dalvik_system_DexFile_fileName); + ArtField* file_name_field = jni::DecodeArtField(WellKnownClasses::dalvik_system_DexFile_fileName); DCHECK_EQ(file_name_field->GetDeclaringClass(), element_file_field->GetType<false>()); // Fill the elements array. @@ -8206,7 +8207,7 @@ jobject ClassLinker::CreatePathClassLoader(Thread* self, DCHECK(h_path_class_loader.Get() != nullptr); // Set DexPathList. ArtField* path_list_field = - soa.DecodeField(WellKnownClasses::dalvik_system_BaseDexClassLoader_pathList); + jni::DecodeArtField(WellKnownClasses::dalvik_system_BaseDexClassLoader_pathList); DCHECK(path_list_field != nullptr); path_list_field->SetObject<false>(h_path_class_loader.Get(), h_dex_path_list.Get()); diff --git a/runtime/common_runtime_test.cc b/runtime/common_runtime_test.cc index 3409938c50..8226e6049e 100644 --- a/runtime/common_runtime_test.cc +++ b/runtime/common_runtime_test.cc @@ -520,17 +520,17 @@ std::vector<const DexFile*> CommonRuntimeTestImpl::GetDexFiles(jobject jclass_lo // The class loader is a PathClassLoader which inherits from BaseDexClassLoader. // We need to get the DexPathList and loop through it. - ArtField* cookie_field = soa.DecodeField(WellKnownClasses::dalvik_system_DexFile_cookie); + ArtField* cookie_field = jni::DecodeArtField(WellKnownClasses::dalvik_system_DexFile_cookie); ArtField* dex_file_field = - soa.DecodeField(WellKnownClasses::dalvik_system_DexPathList__Element_dexFile); + jni::DecodeArtField(WellKnownClasses::dalvik_system_DexPathList__Element_dexFile); ObjPtr<mirror::Object> dex_path_list = - soa.DecodeField(WellKnownClasses::dalvik_system_BaseDexClassLoader_pathList)-> - GetObject(class_loader.Get()); + jni::DecodeArtField(WellKnownClasses::dalvik_system_BaseDexClassLoader_pathList)-> + GetObject(class_loader.Get()); if (dex_path_list != nullptr && dex_file_field!= nullptr && cookie_field != nullptr) { // DexPathList has an array dexElements of Elements[] which each contain a dex file. ObjPtr<mirror::Object> dex_elements_obj = - soa.DecodeField(WellKnownClasses::dalvik_system_DexPathList_dexElements)-> - GetObject(dex_path_list); + jni::DecodeArtField(WellKnownClasses::dalvik_system_DexPathList_dexElements)-> + GetObject(dex_path_list); // Loop through each dalvik.system.DexPathList$Element's dalvik.system.DexFile and look // at the mCookie which is a DexFile vector. if (dex_elements_obj != nullptr) { diff --git a/runtime/debugger.cc b/runtime/debugger.cc index 8cc623284f..dc2ae2e215 100644 --- a/runtime/debugger.cc +++ b/runtime/debugger.cc @@ -2008,7 +2008,7 @@ JDWP::JdwpError Dbg::GetThreadName(JDWP::ObjectId thread_id, std::string* name) mirror::Object* thread_object = gRegistry->Get<mirror::Object*>(thread_id, &error); CHECK(thread_object != nullptr) << error; ArtField* java_lang_Thread_name_field = - soa.DecodeField(WellKnownClasses::java_lang_Thread_name); + jni::DecodeArtField(WellKnownClasses::java_lang_Thread_name); ObjPtr<mirror::String> s(java_lang_Thread_name_field->GetObject(thread_object)->AsString()); if (s != nullptr) { *name = s->ToModifiedUtf8(); @@ -2033,7 +2033,7 @@ JDWP::JdwpError Dbg::GetThreadGroup(JDWP::ObjectId thread_id, JDWP::ExpandBuf* p } else if (error == JDWP::ERR_NONE) { ObjPtr<mirror::Class> c = soa.Decode<mirror::Class>(WellKnownClasses::java_lang_Thread); CHECK(c != nullptr); - ArtField* f = soa.DecodeField(WellKnownClasses::java_lang_Thread_group); + ArtField* f = jni::DecodeArtField(WellKnownClasses::java_lang_Thread_group); CHECK(f != nullptr); ObjPtr<mirror::Object> group = f->GetObject(thread_object); CHECK(group != nullptr); @@ -2075,7 +2075,7 @@ JDWP::JdwpError Dbg::GetThreadGroupName(JDWP::ObjectId thread_group_id, JDWP::Ex return error; } ScopedAssertNoThreadSuspension ants("Debugger: GetThreadGroupName"); - ArtField* f = soa.DecodeField(WellKnownClasses::java_lang_ThreadGroup_name); + ArtField* f = jni::DecodeArtField(WellKnownClasses::java_lang_ThreadGroup_name); CHECK(f != nullptr); ObjPtr<mirror::String> s = f->GetObject(thread_group)->AsString(); @@ -2094,7 +2094,7 @@ JDWP::JdwpError Dbg::GetThreadGroupParent(JDWP::ObjectId thread_group_id, JDWP:: ObjPtr<mirror::Object> parent; { ScopedAssertNoThreadSuspension ants("Debugger: GetThreadGroupParent"); - ArtField* f = soa.DecodeField(WellKnownClasses::java_lang_ThreadGroup_parent); + ArtField* f = jni::DecodeArtField(WellKnownClasses::java_lang_ThreadGroup_parent); CHECK(f != nullptr); parent = f->GetObject(thread_group); } @@ -2103,13 +2103,13 @@ JDWP::JdwpError Dbg::GetThreadGroupParent(JDWP::ObjectId thread_group_id, JDWP:: return JDWP::ERR_NONE; } -static void GetChildThreadGroups(ScopedObjectAccessUnchecked& soa, mirror::Object* thread_group, +static void GetChildThreadGroups(mirror::Object* thread_group, std::vector<JDWP::ObjectId>* child_thread_group_ids) REQUIRES_SHARED(Locks::mutator_lock_) { CHECK(thread_group != nullptr); // Get the int "ngroups" count of this thread group... - ArtField* ngroups_field = soa.DecodeField(WellKnownClasses::java_lang_ThreadGroup_ngroups); + ArtField* ngroups_field = jni::DecodeArtField(WellKnownClasses::java_lang_ThreadGroup_ngroups); CHECK(ngroups_field != nullptr); const int32_t size = ngroups_field->GetInt(thread_group); if (size == 0) { @@ -2117,7 +2117,7 @@ static void GetChildThreadGroups(ScopedObjectAccessUnchecked& soa, mirror::Objec } // Get the ThreadGroup[] "groups" out of this thread group... - ArtField* groups_field = soa.DecodeField(WellKnownClasses::java_lang_ThreadGroup_groups); + ArtField* groups_field = jni::DecodeArtField(WellKnownClasses::java_lang_ThreadGroup_groups); ObjPtr<mirror::Object> groups_array = groups_field->GetObject(thread_group); CHECK(groups_array != nullptr); @@ -2155,7 +2155,7 @@ JDWP::JdwpError Dbg::GetThreadGroupChildren(JDWP::ObjectId thread_group_id, // Add child thread groups. { std::vector<JDWP::ObjectId> child_thread_groups_ids; - GetChildThreadGroups(soa, thread_group, &child_thread_groups_ids); + GetChildThreadGroups(thread_group, &child_thread_groups_ids); expandBufAdd4BE(pReply, child_thread_groups_ids.size()); for (JDWP::ObjectId child_thread_group_id : child_thread_groups_ids) { expandBufAddObjectId(pReply, child_thread_group_id); @@ -2167,7 +2167,7 @@ JDWP::JdwpError Dbg::GetThreadGroupChildren(JDWP::ObjectId thread_group_id, JDWP::ObjectId Dbg::GetSystemThreadGroupId() { ScopedObjectAccessUnchecked soa(Thread::Current()); - ArtField* f = soa.DecodeField(WellKnownClasses::java_lang_ThreadGroup_systemThreadGroup); + ArtField* f = jni::DecodeArtField(WellKnownClasses::java_lang_ThreadGroup_systemThreadGroup); ObjPtr<mirror::Object> group = f->GetObject(f->GetDeclaringClass()); return gRegistry->Add(group); } @@ -2257,14 +2257,13 @@ JDWP::JdwpError Dbg::Interrupt(JDWP::ObjectId thread_id) { return JDWP::ERR_NONE; } -static bool IsInDesiredThreadGroup(ScopedObjectAccessUnchecked& soa, - mirror::Object* desired_thread_group, mirror::Object* peer) +static bool IsInDesiredThreadGroup(mirror::Object* desired_thread_group, mirror::Object* peer) REQUIRES_SHARED(Locks::mutator_lock_) { // Do we want threads from all thread groups? if (desired_thread_group == nullptr) { return true; } - ArtField* thread_group_field = soa.DecodeField(WellKnownClasses::java_lang_Thread_group); + ArtField* thread_group_field = jni::DecodeArtField(WellKnownClasses::java_lang_Thread_group); DCHECK(thread_group_field != nullptr); ObjPtr<mirror::Object> group = thread_group_field->GetObject(peer); return (group == desired_thread_group); @@ -2297,7 +2296,7 @@ void Dbg::GetThreads(mirror::Object* thread_group, std::vector<JDWP::ObjectId>* // Doing so might help us report ZOMBIE threads too. continue; } - if (IsInDesiredThreadGroup(soa, thread_group, peer)) { + if (IsInDesiredThreadGroup(thread_group, peer)) { thread_ids->push_back(gRegistry->Add(peer)); } } @@ -4372,7 +4371,7 @@ void Dbg::DdmSendThreadNotification(Thread* t, uint32_t type) { CHECK(type == CHUNK_TYPE("THCR") || type == CHUNK_TYPE("THNM")) << type; ScopedObjectAccessUnchecked soa(Thread::Current()); StackHandleScope<1> hs(soa.Self()); - Handle<mirror::String> name(hs.NewHandle(t->GetThreadName(soa))); + Handle<mirror::String> name(hs.NewHandle(t->GetThreadName())); size_t char_count = (name.Get() != nullptr) ? name->GetLength() : 0; const jchar* chars = (name.Get() != nullptr) ? name->GetValue() : nullptr; bool is_compressed = (name.Get() != nullptr) ? name->IsCompressed() : false; diff --git a/runtime/jni_internal.cc b/runtime/jni_internal.cc index b0835936e1..01a2ad8f23 100644 --- a/runtime/jni_internal.cc +++ b/runtime/jni_internal.cc @@ -235,7 +235,7 @@ static jfieldID FindFieldID(const ScopedObjectAccess& soa, jclass jni_class, con sig, name, c->GetDescriptor(&temp)); return nullptr; } - return soa.EncodeField(field); + return jni::EncodeArtField(field); } static void ThrowAIOOBE(ScopedObjectAccess& soa, mirror::Array* array, jsize start, @@ -380,7 +380,7 @@ class JNI { return nullptr; } ObjPtr<mirror::Field> field = ObjPtr<mirror::Field>::DownCast(obj_field); - return soa.EncodeField(field->GetArtField()); + return jni::EncodeArtField(field->GetArtField()); } static jobject ToReflectedMethod(JNIEnv* env, jclass, jmethodID mid, jboolean) { @@ -401,7 +401,7 @@ class JNI { static jobject ToReflectedField(JNIEnv* env, jclass, jfieldID fid, jboolean) { CHECK_NON_NULL_ARGUMENT(fid); ScopedObjectAccess soa(env); - ArtField* f = soa.DecodeField(fid); + ArtField* f = jni::DecodeArtField(fid); return soa.AddLocalReference<jobject>( mirror::Field::CreateFromArtField<kRuntimePointerSize>(soa.Self(), f, true)); } @@ -1237,14 +1237,14 @@ class JNI { CHECK_NON_NULL_ARGUMENT(fid); ScopedObjectAccess soa(env); ObjPtr<mirror::Object> o = soa.Decode<mirror::Object>(obj); - ArtField* f = soa.DecodeField(fid); + ArtField* f = jni::DecodeArtField(fid); return soa.AddLocalReference<jobject>(f->GetObject(o)); } static jobject GetStaticObjectField(JNIEnv* env, jclass, jfieldID fid) { CHECK_NON_NULL_ARGUMENT(fid); ScopedObjectAccess soa(env); - ArtField* f = soa.DecodeField(fid); + ArtField* f = jni::DecodeArtField(fid); return soa.AddLocalReference<jobject>(f->GetObject(f->GetDeclaringClass())); } @@ -1254,7 +1254,7 @@ class JNI { ScopedObjectAccess soa(env); ObjPtr<mirror::Object> o = soa.Decode<mirror::Object>(java_object); ObjPtr<mirror::Object> v = soa.Decode<mirror::Object>(java_value); - ArtField* f = soa.DecodeField(fid); + ArtField* f = jni::DecodeArtField(fid); f->SetObject<false>(o, v); } @@ -1262,7 +1262,7 @@ class JNI { CHECK_NON_NULL_ARGUMENT_RETURN_VOID(fid); ScopedObjectAccess soa(env); ObjPtr<mirror::Object> v = soa.Decode<mirror::Object>(java_value); - ArtField* f = soa.DecodeField(fid); + ArtField* f = jni::DecodeArtField(fid); f->SetObject<false>(f->GetDeclaringClass(), v); } @@ -1271,13 +1271,13 @@ class JNI { CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(fid); \ ScopedObjectAccess soa(env); \ ObjPtr<mirror::Object> o = soa.Decode<mirror::Object>(instance); \ - ArtField* f = soa.DecodeField(fid); \ + ArtField* f = jni::DecodeArtField(fid); \ return f->Get ##fn (o) #define GET_STATIC_PRIMITIVE_FIELD(fn) \ CHECK_NON_NULL_ARGUMENT_RETURN_ZERO(fid); \ ScopedObjectAccess soa(env); \ - ArtField* f = soa.DecodeField(fid); \ + ArtField* f = jni::DecodeArtField(fid); \ return f->Get ##fn (f->GetDeclaringClass()) #define SET_PRIMITIVE_FIELD(fn, instance, value) \ @@ -1285,13 +1285,13 @@ class JNI { CHECK_NON_NULL_ARGUMENT_RETURN_VOID(fid); \ ScopedObjectAccess soa(env); \ ObjPtr<mirror::Object> o = soa.Decode<mirror::Object>(instance); \ - ArtField* f = soa.DecodeField(fid); \ + ArtField* f = jni::DecodeArtField(fid); \ f->Set ##fn <false>(o, value) #define SET_STATIC_PRIMITIVE_FIELD(fn, value) \ CHECK_NON_NULL_ARGUMENT_RETURN_VOID(fid); \ ScopedObjectAccess soa(env); \ - ArtField* f = soa.DecodeField(fid); \ + ArtField* f = jni::DecodeArtField(fid); \ f->Set ##fn <false>(f->GetDeclaringClass(), value) static jboolean GetBooleanField(JNIEnv* env, jobject obj, jfieldID fid) { diff --git a/runtime/jni_internal.h b/runtime/jni_internal.h index 0e462d56b3..b3837c409d 100644 --- a/runtime/jni_internal.h +++ b/runtime/jni_internal.h @@ -38,6 +38,7 @@ namespace art { +class ArtField; class ArtMethod; const JNINativeInterface* GetJniNativeInterface(); @@ -53,6 +54,16 @@ int ThrowNewException(JNIEnv* env, jclass exception_class, const char* msg, jobj namespace jni { ALWAYS_INLINE +static inline ArtField* DecodeArtField(jfieldID fid) { + return reinterpret_cast<ArtField*>(fid); +} + +ALWAYS_INLINE +static inline jfieldID EncodeArtField(ArtField* field) { + return reinterpret_cast<jfieldID>(field); +} + +ALWAYS_INLINE static inline jmethodID EncodeArtMethod(ArtMethod* art_method) { return reinterpret_cast<jmethodID>(art_method); } diff --git a/runtime/oat_file_manager.cc b/runtime/oat_file_manager.cc index cf9efe0782..347d32bee2 100644 --- a/runtime/oat_file_manager.cc +++ b/runtime/oat_file_manager.cc @@ -28,6 +28,7 @@ #include "gc/scoped_gc_critical_section.h" #include "gc/space/image_space.h" #include "handle_scope-inl.h" +#include "jni_internal.h" #include "mirror/class_loader.h" #include "oat_file_assistant.h" #include "obj_ptr-inl.h" @@ -248,7 +249,6 @@ static void IterateOverJavaDexFile(ObjPtr<mirror::Object> dex_file, } static void IterateOverPathClassLoader( - ScopedObjectAccessAlreadyRunnable& soa, Handle<mirror::ClassLoader> class_loader, MutableHandle<mirror::ObjectArray<mirror::Object>> dex_elements, std::function<bool(const DexFile*)> fn) REQUIRES_SHARED(Locks::mutator_lock_) { @@ -256,17 +256,18 @@ static void IterateOverPathClassLoader( // Handle as if this is the child PathClassLoader. // The class loader is a PathClassLoader which inherits from BaseDexClassLoader. // We need to get the DexPathList and loop through it. - ArtField* const cookie_field = soa.DecodeField(WellKnownClasses::dalvik_system_DexFile_cookie); + ArtField* const cookie_field = + jni::DecodeArtField(WellKnownClasses::dalvik_system_DexFile_cookie); ArtField* const dex_file_field = - soa.DecodeField(WellKnownClasses::dalvik_system_DexPathList__Element_dexFile); + jni::DecodeArtField(WellKnownClasses::dalvik_system_DexPathList__Element_dexFile); ObjPtr<mirror::Object> dex_path_list = - soa.DecodeField(WellKnownClasses::dalvik_system_BaseDexClassLoader_pathList)-> - GetObject(class_loader.Get()); + jni::DecodeArtField(WellKnownClasses::dalvik_system_BaseDexClassLoader_pathList)-> + GetObject(class_loader.Get()); if (dex_path_list != nullptr && dex_file_field != nullptr && cookie_field != nullptr) { // DexPathList has an array dexElements of Elements[] which each contain a dex file. ObjPtr<mirror::Object> dex_elements_obj = - soa.DecodeField(WellKnownClasses::dalvik_system_DexPathList_dexElements)-> - GetObject(dex_path_list); + jni::DecodeArtField(WellKnownClasses::dalvik_system_DexPathList_dexElements)-> + GetObject(dex_path_list); // Loop through each dalvik.system.DexPathList$Element's dalvik.system.DexFile and look // at the mCookie which is a DexFile vector. if (dex_elements_obj != nullptr) { @@ -323,7 +324,7 @@ static bool GetDexFilesFromClassLoader( hs.NewHandle<mirror::ObjectArray<mirror::Object>>(nullptr)); Handle<mirror::ClassLoader> h_class_loader(hs.NewHandle(class_loader)); - IterateOverPathClassLoader(soa, h_class_loader, dex_elements, GetDexFilesFn); + IterateOverPathClassLoader(h_class_loader, dex_elements, GetDexFilesFn); return true; } @@ -337,9 +338,10 @@ static void GetDexFilesFromDexElementsArray( return; } - ArtField* const cookie_field = soa.DecodeField(WellKnownClasses::dalvik_system_DexFile_cookie); + ArtField* const cookie_field = + jni::DecodeArtField(WellKnownClasses::dalvik_system_DexFile_cookie); ArtField* const dex_file_field = - soa.DecodeField(WellKnownClasses::dalvik_system_DexPathList__Element_dexFile); + jni::DecodeArtField(WellKnownClasses::dalvik_system_DexPathList__Element_dexFile); ObjPtr<mirror::Class> const element_class = soa.Decode<mirror::Class>( WellKnownClasses::dalvik_system_DexPathList__Element); ObjPtr<mirror::Class> const dexfile_class = soa.Decode<mirror::Class>( diff --git a/runtime/scoped_thread_state_change-inl.h b/runtime/scoped_thread_state_change-inl.h index a8640c0c7e..d4469f4357 100644 --- a/runtime/scoped_thread_state_change-inl.h +++ b/runtime/scoped_thread_state_change-inl.h @@ -86,18 +86,6 @@ inline ObjPtr<T, kPoison> ScopedObjectAccessAlreadyRunnable::Decode(jobject obj) return ObjPtr<T, kPoison>::DownCast(Self()->DecodeJObject(obj)); } -inline ArtField* ScopedObjectAccessAlreadyRunnable::DecodeField(jfieldID fid) const { - Locks::mutator_lock_->AssertSharedHeld(Self()); - DCHECK(IsRunnable()); // Don't work with raw objects in non-runnable states. - return reinterpret_cast<ArtField*>(fid); -} - -inline jfieldID ScopedObjectAccessAlreadyRunnable::EncodeField(ArtField* field) const { - Locks::mutator_lock_->AssertSharedHeld(Self()); - DCHECK(IsRunnable()); // Don't work with raw objects in non-runnable states. - return reinterpret_cast<jfieldID>(field); -} - inline bool ScopedObjectAccessAlreadyRunnable::IsRunnable() const { return self_->GetState() == kRunnable; } diff --git a/runtime/scoped_thread_state_change.h b/runtime/scoped_thread_state_change.h index 65362c8d24..b4992586ce 100644 --- a/runtime/scoped_thread_state_change.h +++ b/runtime/scoped_thread_state_change.h @@ -94,10 +94,6 @@ class ScopedObjectAccessAlreadyRunnable : public ValueObject { template<typename T, bool kPoison = kIsDebugBuild> ObjPtr<T, kPoison> Decode(jobject obj) const REQUIRES_SHARED(Locks::mutator_lock_); - ArtField* DecodeField(jfieldID fid) const REQUIRES_SHARED(Locks::mutator_lock_); - - jfieldID EncodeField(ArtField* field) const REQUIRES_SHARED(Locks::mutator_lock_); - ALWAYS_INLINE bool IsRunnable() const; protected: diff --git a/runtime/thread.cc b/runtime/thread.cc index bd5edaa421..8ce9661dfe 100644 --- a/runtime/thread.cc +++ b/runtime/thread.cc @@ -410,9 +410,9 @@ void* Thread::CreateCallback(void* arg) { self->tlsPtr_.opeer = soa.Decode<mirror::Object>(self->tlsPtr_.jpeer).Ptr(); self->GetJniEnv()->DeleteGlobalRef(self->tlsPtr_.jpeer); self->tlsPtr_.jpeer = nullptr; - self->SetThreadName(self->GetThreadName(soa)->ToModifiedUtf8().c_str()); + self->SetThreadName(self->GetThreadName()->ToModifiedUtf8().c_str()); - ArtField* priorityField = soa.DecodeField(WellKnownClasses::java_lang_Thread_priority); + ArtField* priorityField = jni::DecodeArtField(WellKnownClasses::java_lang_Thread_priority); self->SetNativePriority(priorityField->GetInt(self->tlsPtr_.opeer)); Dbg::PostThreadStart(self); @@ -430,7 +430,7 @@ void* Thread::CreateCallback(void* arg) { Thread* Thread::FromManagedThread(const ScopedObjectAccessAlreadyRunnable& soa, mirror::Object* thread_peer) { - ArtField* f = soa.DecodeField(WellKnownClasses::java_lang_Thread_nativePeer); + ArtField* f = jni::DecodeArtField(WellKnownClasses::java_lang_Thread_nativePeer); Thread* result = reinterpret_cast<Thread*>(static_cast<uintptr_t>(f->GetLong(thread_peer))); // Sanity check that if we have a result it is either suspended or we hold the thread_list_lock_ // to stop it from going away. @@ -562,7 +562,7 @@ void Thread::CreateNativeThread(JNIEnv* env, jobject java_peer, size_t stack_siz if (VLOG_IS_ON(threads)) { ScopedObjectAccess soa(env); - ArtField* f = soa.DecodeField(WellKnownClasses::java_lang_Thread_name); + ArtField* f = jni::DecodeArtField(WellKnownClasses::java_lang_Thread_name); ObjPtr<mirror::String> java_name = f->GetObject(soa.Decode<mirror::Object>(java_peer))->AsString(); std::string thread_name; @@ -823,7 +823,7 @@ void Thread::CreatePeer(const char* name, bool as_daemon, jobject thread_group) ScopedObjectAccess soa(self); StackHandleScope<1> hs(self); - MutableHandle<mirror::String> peer_thread_name(hs.NewHandle(GetThreadName(soa))); + MutableHandle<mirror::String> peer_thread_name(hs.NewHandle(GetThreadName())); if (peer_thread_name.Get() == nullptr) { // The Thread constructor should have set the Thread.name to a // non-null value. However, because we can run without code @@ -834,7 +834,7 @@ void Thread::CreatePeer(const char* name, bool as_daemon, jobject thread_group) } else { InitPeer<false>(soa, thread_is_daemon, thread_group, thread_name.get(), thread_priority); } - peer_thread_name.Assign(GetThreadName(soa)); + peer_thread_name.Assign(GetThreadName()); } // 'thread_name' may have been null, so don't trust 'peer_thread_name' to be non-null. if (peer_thread_name.Get() != nullptr) { @@ -845,13 +845,13 @@ void Thread::CreatePeer(const char* name, bool as_daemon, jobject thread_group) template<bool kTransactionActive> void Thread::InitPeer(ScopedObjectAccess& soa, jboolean thread_is_daemon, jobject thread_group, jobject thread_name, jint thread_priority) { - soa.DecodeField(WellKnownClasses::java_lang_Thread_daemon)-> + jni::DecodeArtField(WellKnownClasses::java_lang_Thread_daemon)-> SetBoolean<kTransactionActive>(tlsPtr_.opeer, thread_is_daemon); - soa.DecodeField(WellKnownClasses::java_lang_Thread_group)-> + jni::DecodeArtField(WellKnownClasses::java_lang_Thread_group)-> SetObject<kTransactionActive>(tlsPtr_.opeer, soa.Decode<mirror::Object>(thread_group)); - soa.DecodeField(WellKnownClasses::java_lang_Thread_name)-> + jni::DecodeArtField(WellKnownClasses::java_lang_Thread_name)-> SetObject<kTransactionActive>(tlsPtr_.opeer, soa.Decode<mirror::Object>(thread_name)); - soa.DecodeField(WellKnownClasses::java_lang_Thread_priority)-> + jni::DecodeArtField(WellKnownClasses::java_lang_Thread_priority)-> SetInt<kTransactionActive>(tlsPtr_.opeer, thread_priority); } @@ -947,8 +947,8 @@ void Thread::Dump(std::ostream& os, bool dump_native_stack, BacktraceMap* backtr DumpStack(os, dump_native_stack, backtrace_map); } -mirror::String* Thread::GetThreadName(const ScopedObjectAccessAlreadyRunnable& soa) const { - ArtField* f = soa.DecodeField(WellKnownClasses::java_lang_Thread_name); +mirror::String* Thread::GetThreadName() const { + ArtField* f = jni::DecodeArtField(WellKnownClasses::java_lang_Thread_name); if (tlsPtr_.opeer == nullptr) { return nullptr; } @@ -1306,17 +1306,18 @@ void Thread::DumpState(std::ostream& os, const Thread* thread, pid_t tid) { // cause ScopedObjectAccessUnchecked to deadlock. if (gAborting == 0 && self != nullptr && thread != nullptr && thread->tlsPtr_.opeer != nullptr) { ScopedObjectAccessUnchecked soa(self); - priority = soa.DecodeField(WellKnownClasses::java_lang_Thread_priority) + priority = jni::DecodeArtField(WellKnownClasses::java_lang_Thread_priority) ->GetInt(thread->tlsPtr_.opeer); - is_daemon = soa.DecodeField(WellKnownClasses::java_lang_Thread_daemon) + is_daemon = jni::DecodeArtField(WellKnownClasses::java_lang_Thread_daemon) ->GetBoolean(thread->tlsPtr_.opeer); ObjPtr<mirror::Object> thread_group = - soa.DecodeField(WellKnownClasses::java_lang_Thread_group)->GetObject(thread->tlsPtr_.opeer); + jni::DecodeArtField(WellKnownClasses::java_lang_Thread_group) + ->GetObject(thread->tlsPtr_.opeer); if (thread_group != nullptr) { ArtField* group_name_field = - soa.DecodeField(WellKnownClasses::java_lang_ThreadGroup_name); + jni::DecodeArtField(WellKnownClasses::java_lang_ThreadGroup_name); ObjPtr<mirror::String> group_name_string = group_name_field->GetObject(thread_group)->AsString(); group_name = (group_name_string != nullptr) ? group_name_string->ToModifiedUtf8() : "<null>"; @@ -1792,10 +1793,10 @@ void Thread::Destroy() { // this.nativePeer = 0; if (Runtime::Current()->IsActiveTransaction()) { - soa.DecodeField(WellKnownClasses::java_lang_Thread_nativePeer) + jni::DecodeArtField(WellKnownClasses::java_lang_Thread_nativePeer) ->SetLong<true>(tlsPtr_.opeer, 0); } else { - soa.DecodeField(WellKnownClasses::java_lang_Thread_nativePeer) + jni::DecodeArtField(WellKnownClasses::java_lang_Thread_nativePeer) ->SetLong<false>(tlsPtr_.opeer, 0); } Dbg::PostThreadDeath(self); @@ -1803,7 +1804,7 @@ void Thread::Destroy() { // Thread.join() is implemented as an Object.wait() on the Thread.lock object. Signal anyone // who is waiting. ObjPtr<mirror::Object> lock = - soa.DecodeField(WellKnownClasses::java_lang_Thread_lock)->GetObject(tlsPtr_.opeer); + jni::DecodeArtField(WellKnownClasses::java_lang_Thread_lock)->GetObject(tlsPtr_.opeer); // (This conditional is only needed for tests, where Thread.lock won't have been set.) if (lock != nullptr) { StackHandleScope<1> hs(self); @@ -1894,7 +1895,7 @@ void Thread::HandleUncaughtExceptions(ScopedObjectAccess& soa) { void Thread::RemoveFromThreadGroup(ScopedObjectAccess& soa) { // this.group.removeThread(this); // group can be null if we're in the compiler or a test. - ObjPtr<mirror::Object> ogroup = soa.DecodeField(WellKnownClasses::java_lang_Thread_group) + ObjPtr<mirror::Object> ogroup = jni::DecodeArtField(WellKnownClasses::java_lang_Thread_group) ->GetObject(tlsPtr_.opeer); if (ogroup != nullptr) { ScopedLocalRef<jobject> group(soa.Env(), soa.AddLocalReference<jobject>(ogroup)); diff --git a/runtime/thread.h b/runtime/thread.h index 4f26803726..f3001be202 100644 --- a/runtime/thread.h +++ b/runtime/thread.h @@ -333,8 +333,7 @@ class Thread { } // Returns the java.lang.Thread's name, or null if this Thread* doesn't have a peer. - mirror::String* GetThreadName(const ScopedObjectAccessAlreadyRunnable& ts) const - REQUIRES_SHARED(Locks::mutator_lock_); + mirror::String* GetThreadName() const REQUIRES_SHARED(Locks::mutator_lock_); // Sets 'name' to the java.lang.Thread's name. This requires no transition to managed code, // allocation, or locking. |