diff options
Diffstat (limited to 'runtime/art_method-inl.h')
-rw-r--r-- | runtime/art_method-inl.h | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/runtime/art_method-inl.h b/runtime/art_method-inl.h index 844a0ffa9b..b071714382 100644 --- a/runtime/art_method-inl.h +++ b/runtime/art_method-inl.h @@ -388,17 +388,19 @@ inline bool ArtMethod::HasSingleImplementation() { return (GetAccessFlags() & kAccSingleImplementation) != 0; } -template<ReadBarrierOption kReadBarrierOption, typename RootVisitorType> +template<ReadBarrierOption kReadBarrierOption, bool kVisitProxyMethod, typename RootVisitorType> void ArtMethod::VisitRoots(RootVisitorType& visitor, PointerSize pointer_size) { if (LIKELY(!declaring_class_.IsNull())) { visitor.VisitRoot(declaring_class_.AddressWithoutBarrier()); - ObjPtr<mirror::Class> klass = declaring_class_.Read<kReadBarrierOption>(); - if (UNLIKELY(klass->IsProxyClass())) { - // For normal methods, dex cache shortcuts will be visited through the declaring class. - // However, for proxies we need to keep the interface method alive, so we visit its roots. - ArtMethod* interface_method = GetInterfaceMethodForProxyUnchecked(pointer_size); - DCHECK(interface_method != nullptr); - interface_method->VisitRoots<kReadBarrierOption>(visitor, pointer_size); + if (kVisitProxyMethod) { + ObjPtr<mirror::Class> klass = declaring_class_.Read<kReadBarrierOption>(); + if (UNLIKELY(klass->IsProxyClass())) { + // For normal methods, dex cache shortcuts will be visited through the declaring class. + // However, for proxies we need to keep the interface method alive, so we visit its roots. + ArtMethod* interface_method = GetInterfaceMethodForProxyUnchecked(pointer_size); + DCHECK(interface_method != nullptr); + interface_method->VisitRoots<kReadBarrierOption, kVisitProxyMethod>(visitor, pointer_size); + } } } } |