diff options
author | 2018-02-01 19:09:59 +0300 | |
---|---|---|
committer | 2018-03-13 17:01:21 +0300 | |
commit | be4c2bd892bd167a50b4dfa7133e70a809197698 (patch) | |
tree | 150898533382fb98c160e265a5f31f66ded754f0 /runtime/mirror/class-inl.h | |
parent | bfce631960ae2ab381180beb55cf34ab3b445aaa (diff) |
Fix dangling SingleImplementations left after class unloading
Test: make test-art-host, manual using sample code
bug: 73143991
Change-Id: I4d56b39c69d4ed60266a8b90b9e9d18fba7b8227
Diffstat (limited to 'runtime/mirror/class-inl.h')
-rw-r--r-- | runtime/mirror/class-inl.h | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/runtime/mirror/class-inl.h b/runtime/mirror/class-inl.h index ee7d217e8d..f63f105c3a 100644 --- a/runtime/mirror/class-inl.h +++ b/runtime/mirror/class-inl.h @@ -304,20 +304,25 @@ inline bool Class::HasVTable() { return GetVTable() != nullptr || ShouldHaveEmbeddedVTable(); } + template<VerifyObjectFlags kVerifyFlags, + ReadBarrierOption kReadBarrierOption> inline int32_t Class::GetVTableLength() { - if (ShouldHaveEmbeddedVTable()) { + if (ShouldHaveEmbeddedVTable<kVerifyFlags, kReadBarrierOption>()) { return GetEmbeddedVTableLength(); } - return GetVTable() != nullptr ? GetVTable()->GetLength() : 0; + return GetVTable<kVerifyFlags, kReadBarrierOption>() != nullptr ? + GetVTable<kVerifyFlags, kReadBarrierOption>()->GetLength() : 0; } + template<VerifyObjectFlags kVerifyFlags, + ReadBarrierOption kReadBarrierOption> inline ArtMethod* Class::GetVTableEntry(uint32_t i, PointerSize pointer_size) { - if (ShouldHaveEmbeddedVTable()) { + if (ShouldHaveEmbeddedVTable<kVerifyFlags, kReadBarrierOption>()) { return GetEmbeddedVTableEntry(i, pointer_size); } - auto* vtable = GetVTable(); + auto* vtable = GetVTable<kVerifyFlags, kReadBarrierOption>(); DCHECK(vtable != nullptr); - return vtable->GetElementPtrSize<ArtMethod*>(i, pointer_size); + return vtable->template GetElementPtrSize<ArtMethod*, kVerifyFlags, kReadBarrierOption>(i, pointer_size); } inline int32_t Class::GetEmbeddedVTableLength() { @@ -627,8 +632,10 @@ inline IfTable* Class::GetIfTable() { return ret.Ptr(); } +template<VerifyObjectFlags kVerifyFlags, + ReadBarrierOption kReadBarrierOption> inline int32_t Class::GetIfTableCount() { - return GetIfTable()->Count(); + return GetIfTable<kVerifyFlags, kReadBarrierOption>()->Count(); } inline void Class::SetIfTable(ObjPtr<IfTable> new_iftable) { |