diff options
Diffstat (limited to 'runtime/art_method-inl.h')
| -rw-r--r-- | runtime/art_method-inl.h | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/runtime/art_method-inl.h b/runtime/art_method-inl.h index 0f5ffa0c49..50e91447a9 100644 --- a/runtime/art_method-inl.h +++ b/runtime/art_method-inl.h @@ -388,11 +388,17 @@ inline ArtMethod* ArtMethod::GetInterfaceMethodIfProxy(PointerSize pointer_size) if (LIKELY(!IsProxyMethod())) { return this; } - ArtMethod* interface_method = reinterpret_cast<ArtMethod*>(GetDataPtrSize(pointer_size)); - // We can check that the proxy class implements the interface only if the proxy class - // is resolved, otherwise the interface table is not yet initialized. - DCHECK(!GetDeclaringClass()->IsResolved() || - interface_method->GetDeclaringClass()->IsAssignableFrom(GetDeclaringClass())); + uint32_t method_index = GetDexMethodIndex(); + uint32_t slot_idx = method_index % mirror::DexCache::kDexCacheMethodCacheSize; + mirror::MethodDexCachePair pair = mirror::DexCache::GetNativePairPtrSize( + GetDexCacheResolvedMethods(pointer_size), slot_idx, pointer_size); + ArtMethod* interface_method = pair.GetObjectForIndex(method_index); + if (LIKELY(interface_method != nullptr)) { + DCHECK_EQ(interface_method, Runtime::Current()->GetClassLinker()->FindMethodForProxy(this)); + } else { + interface_method = Runtime::Current()->GetClassLinker()->FindMethodForProxy(this); + DCHECK(interface_method != nullptr); + } return interface_method; } |