diff options
| author | 2016-02-01 20:15:11 -0800 | |
|---|---|---|
| committer | 2016-02-02 15:43:05 -0800 | |
| commit | dfe02f6aafee264478d510b9742ee266ea52e8a8 (patch) | |
| tree | d56729901410de2b5cea9395c4686b49c38b245d /runtime/mirror/array-inl.h | |
| parent | 85fdcda926fbab0e5a7b3e8b3541f5d225b2bcdb (diff) | |
Fix remaining read barrier issues in image relocation
Added a way to disallow read barriers, this makes it easy to find
the issues.
Bug: 26786304
Change-Id: I7ebb50832686d03e096a979aae9741239371683f
Diffstat (limited to 'runtime/mirror/array-inl.h')
| -rw-r--r-- | runtime/mirror/array-inl.h | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/runtime/mirror/array-inl.h b/runtime/mirror/array-inl.h index b3439f7643..c6fa15de8c 100644 --- a/runtime/mirror/array-inl.h +++ b/runtime/mirror/array-inl.h @@ -370,15 +370,17 @@ inline void PrimitiveArray<T>::Memcpy(int32_t dst_pos, PrimitiveArray<T>* src, i } } -template<typename T> +template<typename T, VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption> inline T PointerArray::GetElementPtrSize(uint32_t idx, size_t ptr_size) { // C style casts here since we sometimes have T be a pointer, or sometimes an integer // (for stack traces). if (ptr_size == 8) { - return (T)static_cast<uintptr_t>(AsLongArray()->GetWithoutChecks(idx)); + return (T)static_cast<uintptr_t>( + AsLongArray<kVerifyFlags, kReadBarrierOption>()->GetWithoutChecks(idx)); } DCHECK_EQ(ptr_size, 4u); - return (T)static_cast<uintptr_t>(AsIntArray()->GetWithoutChecks(idx)); + return (T)static_cast<uintptr_t>( + AsIntArray<kVerifyFlags, kReadBarrierOption>()->GetWithoutChecks(idx)); } template<bool kTransactionActive, bool kUnchecked> @@ -401,12 +403,12 @@ inline void PointerArray::SetElementPtrSize(uint32_t idx, T* element, size_t ptr ptr_size); } -template <typename Visitor> +template <VerifyObjectFlags kVerifyFlags, ReadBarrierOption kReadBarrierOption, typename Visitor> inline void PointerArray::Fixup(mirror::PointerArray* dest, size_t pointer_size, const Visitor& visitor) { for (size_t i = 0, count = GetLength(); i < count; ++i) { - void* ptr = GetElementPtrSize<void*>(i, pointer_size); + void* ptr = GetElementPtrSize<void*, kVerifyFlags, kReadBarrierOption>(i, pointer_size); void* new_ptr = visitor(ptr); if (ptr != new_ptr) { dest->SetElementPtrSize<false, true>(i, new_ptr, pointer_size); |