diff options
| -rw-r--r-- | runtime/class_linker.cc | 2 | ||||
| -rw-r--r-- | runtime/mirror/class.cc | 15 | ||||
| -rw-r--r-- | runtime/mirror/class.h | 4 | ||||
| -rw-r--r-- | runtime/native/dalvik_system_VMRuntime.cc | 2 |
4 files changed, 14 insertions, 9 deletions
diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc index fe7448fa25..95cb56b547 100644 --- a/runtime/class_linker.cc +++ b/runtime/class_linker.cc @@ -7599,7 +7599,7 @@ ArtField* ClassLinker::ResolveField(const DexFile& dex_file, } if (is_static) { - resolved = mirror::Class::FindStaticField(self, klass, dex_cache.Get(), field_idx); + resolved = mirror::Class::FindStaticField(self, klass.Get(), dex_cache.Get(), field_idx); } else { resolved = klass->FindInstanceField(dex_cache.Get(), field_idx); } diff --git a/runtime/mirror/class.cc b/runtime/mirror/class.cc index b4a23badba..2b1d19ba35 100644 --- a/runtime/mirror/class.cc +++ b/runtime/mirror/class.cc @@ -748,21 +748,24 @@ ArtField* Class::FindStaticField(Thread* self, Handle<Class> klass, const String return nullptr; } -ArtField* Class::FindStaticField(Thread* self, Handle<Class> klass, const DexCache* dex_cache, +ArtField* Class::FindStaticField(Thread* self, + Class* klass, + const DexCache* dex_cache, uint32_t dex_field_idx) { - for (Class* k = klass.Get(); k != nullptr; k = k->GetSuperClass()) { + for (Class* k = klass; k != nullptr; k = k->GetSuperClass()) { // Is the field in this class? ArtField* f = k->FindDeclaredStaticField(dex_cache, dex_field_idx); if (f != nullptr) { return f; } - // Wrap k incase it moves during GetDirectInterface. + // Though GetDirectInterface() should not cause thread suspension when called + // from here, it takes a Handle as an argument, so we need to wrap `k`. + ScopedAssertNoThreadSuspension ants(self, __FUNCTION__); StackHandleScope<1> hs(self); - HandleWrapper<mirror::Class> h_k(hs.NewHandleWrapper(&k)); + Handle<mirror::Class> h_k(hs.NewHandle(k)); // Is this field in any of this class' interfaces? for (uint32_t i = 0; i < h_k->NumDirectInterfaces(); ++i) { - StackHandleScope<1> hs2(self); - Handle<mirror::Class> interface(hs2.NewHandle(GetDirectInterface(self, h_k, i))); + mirror::Class* interface = GetDirectInterface(self, h_k, i); f = FindStaticField(self, interface, dex_cache, dex_field_idx); if (f != nullptr) { return f; diff --git a/runtime/mirror/class.h b/runtime/mirror/class.h index 5235a3e8df..b66cdcfd5f 100644 --- a/runtime/mirror/class.h +++ b/runtime/mirror/class.h @@ -1096,7 +1096,9 @@ class MANAGED Class FINAL : public Object { // Finds the given static field in this class or superclass, only searches classes that // have the same dex cache. - static ArtField* FindStaticField(Thread* self, Handle<Class> klass, const DexCache* dex_cache, + static ArtField* FindStaticField(Thread* self, + Class* klass, + const DexCache* dex_cache, uint32_t dex_field_idx) SHARED_REQUIRES(Locks::mutator_lock_); diff --git a/runtime/native/dalvik_system_VMRuntime.cc b/runtime/native/dalvik_system_VMRuntime.cc index 79b18aa84e..d987f65a08 100644 --- a/runtime/native/dalvik_system_VMRuntime.cc +++ b/runtime/native/dalvik_system_VMRuntime.cc @@ -342,7 +342,7 @@ static void PreloadDexCachesResolveField(Handle<mirror::DexCache> dex_cache, uin return; } if (is_static) { - field = mirror::Class::FindStaticField(self, klass, dex_cache.Get(), field_idx); + field = mirror::Class::FindStaticField(self, klass.Get(), dex_cache.Get(), field_idx); } else { field = klass->FindInstanceField(dex_cache.Get(), field_idx); } |