diff options
Diffstat (limited to 'runtime/class_linker-inl.h')
| -rw-r--r-- | runtime/class_linker-inl.h | 45 |
1 files changed, 18 insertions, 27 deletions
diff --git a/runtime/class_linker-inl.h b/runtime/class_linker-inl.h index 1428749aca..df6703cc7b 100644 --- a/runtime/class_linker-inl.h +++ b/runtime/class_linker-inl.h @@ -57,7 +57,7 @@ inline mirror::Class* ClassLinker::FindArrayClass(Thread* self, mirror::Class** } inline mirror::String* ClassLinker::ResolveString(uint32_t string_idx, - mirror::ArtMethod* referrer) { + ArtMethod* referrer) { mirror::Class* declaring_class = referrer->GetDeclaringClass(); mirror::String* resolved_string = declaring_class->GetDexCacheStrings()->Get(string_idx); if (UNLIKELY(resolved_string == nullptr)) { @@ -73,7 +73,7 @@ inline mirror::String* ClassLinker::ResolveString(uint32_t string_idx, } inline mirror::Class* ClassLinker::ResolveType(uint16_t type_idx, - mirror::ArtMethod* referrer) { + ArtMethod* referrer) { mirror::Class* resolved_type = referrer->GetDexCacheResolvedType(type_idx); if (UNLIKELY(resolved_type == nullptr)) { mirror::Class* declaring_class = referrer->GetDeclaringClass(); @@ -104,30 +104,27 @@ inline mirror::Class* ClassLinker::ResolveType(uint16_t type_idx, ArtField* refe return resolved_type; } -inline mirror::ArtMethod* ClassLinker::GetResolvedMethod(uint32_t method_idx, - mirror::ArtMethod* referrer) { - mirror::ArtMethod* resolved_method = referrer->GetDexCacheResolvedMethod(method_idx); +inline ArtMethod* ClassLinker::GetResolvedMethod(uint32_t method_idx, ArtMethod* referrer) { + ArtMethod* resolved_method = referrer->GetDexCacheResolvedMethod( + method_idx, image_pointer_size_); if (resolved_method == nullptr || resolved_method->IsRuntimeMethod()) { return nullptr; } return resolved_method; } -inline mirror::ArtMethod* ClassLinker::ResolveMethod(Thread* self, uint32_t method_idx, - mirror::ArtMethod** referrer, - InvokeType type) { - mirror::ArtMethod* resolved_method = GetResolvedMethod(method_idx, *referrer); - if (LIKELY(resolved_method != nullptr)) { - return resolved_method; +inline ArtMethod* ClassLinker::ResolveMethod(Thread* self, uint32_t method_idx, + ArtMethod* referrer, InvokeType type) { + ArtMethod* resolved_method = GetResolvedMethod(method_idx, referrer); + if (UNLIKELY(resolved_method == nullptr)) { + mirror::Class* declaring_class = referrer->GetDeclaringClass(); + StackHandleScope<2> hs(self); + Handle<mirror::DexCache> h_dex_cache(hs.NewHandle(declaring_class->GetDexCache())); + Handle<mirror::ClassLoader> h_class_loader(hs.NewHandle(declaring_class->GetClassLoader())); + const DexFile* dex_file = h_dex_cache->GetDexFile(); + resolved_method = ResolveMethod(*dex_file, method_idx, h_dex_cache, h_class_loader, referrer, + type); } - mirror::Class* declaring_class = (*referrer)->GetDeclaringClass(); - StackHandleScope<3> hs(self); - Handle<mirror::DexCache> h_dex_cache(hs.NewHandle(declaring_class->GetDexCache())); - Handle<mirror::ClassLoader> h_class_loader(hs.NewHandle(declaring_class->GetClassLoader())); - HandleWrapper<mirror::ArtMethod> h_referrer(hs.NewHandleWrapper(referrer)); - const DexFile* dex_file = h_dex_cache->GetDexFile(); - resolved_method = ResolveMethod(*dex_file, method_idx, h_dex_cache, h_class_loader, h_referrer, - type); // Note: We cannot check here to see whether we added the method to the cache. It // might be an erroneous class, which results in it being hidden from us. return resolved_method; @@ -142,8 +139,8 @@ inline ArtField* ClassLinker::GetResolvedField( return GetResolvedField(field_idx, field_declaring_class->GetDexCache()); } -inline ArtField* ClassLinker::ResolveField(uint32_t field_idx, mirror::ArtMethod* referrer, - bool is_static) { +inline ArtField* ClassLinker::ResolveField(uint32_t field_idx, ArtMethod* referrer, + bool is_static) { mirror::Class* declaring_class = referrer->GetDeclaringClass(); ArtField* resolved_field = GetResolvedField(field_idx, declaring_class); if (UNLIKELY(resolved_field == nullptr)) { @@ -179,12 +176,6 @@ inline mirror::ObjectArray<mirror::String>* ClassLinker::AllocStringArray(Thread length); } -inline mirror::ObjectArray<mirror::ArtMethod>* ClassLinker::AllocArtMethodArray(Thread* self, - size_t length) { - return mirror::ObjectArray<mirror::ArtMethod>::Alloc(self, - GetClassRoot(kJavaLangReflectArtMethodArrayClass), length); -} - inline mirror::IfTable* ClassLinker::AllocIfTable(Thread* self, size_t ifcount) { return down_cast<mirror::IfTable*>( mirror::IfTable::Alloc(self, GetClassRoot(kObjectArrayClass), |