diff options
| author | 2016-01-27 15:30:10 -0800 | |
|---|---|---|
| committer | 2016-01-27 16:22:14 -0800 | |
| commit | d329a3b6a77148839171132eb779577fe4b16cdd (patch) | |
| tree | 24b422aa499e8b95d8b750c4c3b8d3382917c9ca /runtime/mirror/array-inl.h | |
| parent | 78e90155b249588cb800e7f6e5993ebcbd465292 (diff) | |
Fix pointer conversion error in SetElementPtrSize
SetElementPtrSize used to cast from pointer to uint64_t which
could sign extend with 32 bit dex2oat for 64 bit app image.
Also removed C style casts and added more logging.
Bug: 22858531
(cherry picked from commit d22886357d4c53f74ca298faa7ad2555794e17e0)
Change-Id: I479124328fbc497cfcae20c43b4b55827e446527
Diffstat (limited to 'runtime/mirror/array-inl.h')
| -rw-r--r-- | runtime/mirror/array-inl.h | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/runtime/mirror/array-inl.h b/runtime/mirror/array-inl.h index b6f424b3a4..4b98e5f7e0 100644 --- a/runtime/mirror/array-inl.h +++ b/runtime/mirror/array-inl.h @@ -381,19 +381,24 @@ inline T PointerArray::GetElementPtrSize(uint32_t idx, size_t ptr_size) { return (T)static_cast<uintptr_t>(AsIntArray()->GetWithoutChecks(idx)); } -template<bool kTransactionActive, bool kUnchecked, typename T> -inline void PointerArray::SetElementPtrSize(uint32_t idx, T element, size_t ptr_size) { +template<bool kTransactionActive, bool kUnchecked> +inline void PointerArray::SetElementPtrSize(uint32_t idx, uint64_t element, size_t ptr_size) { if (ptr_size == 8) { (kUnchecked ? down_cast<LongArray*>(static_cast<Object*>(this)) : AsLongArray())-> - SetWithoutChecks<kTransactionActive>(idx, (uint64_t)(element)); + SetWithoutChecks<kTransactionActive>(idx, element); } else { DCHECK_EQ(ptr_size, 4u); - DCHECK_LE((uintptr_t)element, 0xFFFFFFFFu); + DCHECK_LE(element, static_cast<uint64_t>(0xFFFFFFFFu)); (kUnchecked ? down_cast<IntArray*>(static_cast<Object*>(this)) : AsIntArray()) - ->SetWithoutChecks<kTransactionActive>(idx, static_cast<uint32_t>((uintptr_t)element)); + ->SetWithoutChecks<kTransactionActive>(idx, static_cast<uint32_t>(element)); } } +template<bool kTransactionActive, bool kUnchecked, typename T> +inline void PointerArray::SetElementPtrSize(uint32_t idx, T* element, size_t ptr_size) { + SetElementPtrSize(idx, reinterpret_cast<uintptr_t>(element), ptr_size); +} + template <typename Visitor> inline void PointerArray::Fixup(mirror::PointerArray* dest, size_t pointer_size, |