summaryrefslogtreecommitdiff
path: root/runtime/mirror/array-inl.h
diff options
context:
space:
mode:
author Mathieu Chartier <mathieuc@google.com> 2016-01-27 15:30:10 -0800
committer Mathieu Chartier <mathieuc@google.com> 2016-01-27 16:22:14 -0800
commitd329a3b6a77148839171132eb779577fe4b16cdd (patch)
tree24b422aa499e8b95d8b750c4c3b8d3382917c9ca /runtime/mirror/array-inl.h
parent78e90155b249588cb800e7f6e5993ebcbd465292 (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.h15
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,