summaryrefslogtreecommitdiff
path: root/runtime/mirror/array-inl.h
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/mirror/array-inl.h')
-rw-r--r--runtime/mirror/array-inl.h20
1 files changed, 11 insertions, 9 deletions
diff --git a/runtime/mirror/array-inl.h b/runtime/mirror/array-inl.h
index 34925f52e2..b75aa5d011 100644
--- a/runtime/mirror/array-inl.h
+++ b/runtime/mirror/array-inl.h
@@ -22,6 +22,7 @@
#include <android-base/logging.h>
#include "base/bit_utils.h"
+#include "base/casts.h"
#include "class.h"
#include "obj_ptr-inl.h"
#include "runtime.h"
@@ -251,23 +252,22 @@ inline T PointerArray::GetElementPtrSize(uint32_t idx, PointerSize ptr_size) {
return GetElementPtrSize<T, PointerSize::k32, kVerifyFlags>(idx);
}
-template<bool kTransactionActive, bool kUnchecked>
+template<bool kTransactionActive, bool kCheckTransaction, bool kUnchecked>
inline void PointerArray::SetElementPtrSize(uint32_t idx, uint64_t element, PointerSize ptr_size) {
if (ptr_size == PointerSize::k64) {
(kUnchecked ? ObjPtr<LongArray>::DownCast(ObjPtr<Object>(this)) : AsLongArray())->
- SetWithoutChecks<kTransactionActive>(idx, element);
+ SetWithoutChecks<kTransactionActive, kCheckTransaction>(idx, element);
} else {
- DCHECK_LE(element, static_cast<uint64_t>(0xFFFFFFFFu));
+ uint32_t element32 = dchecked_integral_cast<uint32_t>(element);
(kUnchecked ? ObjPtr<IntArray>::DownCast(ObjPtr<Object>(this)) : AsIntArray())
- ->SetWithoutChecks<kTransactionActive>(idx, static_cast<uint32_t>(element));
+ ->SetWithoutChecks<kTransactionActive, kCheckTransaction>(idx, element32);
}
}
-template<bool kTransactionActive, bool kUnchecked, typename T>
+template<bool kTransactionActive, bool kCheckTransaction, bool kUnchecked, typename T>
inline void PointerArray::SetElementPtrSize(uint32_t idx, T* element, PointerSize ptr_size) {
- SetElementPtrSize<kTransactionActive, kUnchecked>(idx,
- reinterpret_cast<uintptr_t>(element),
- ptr_size);
+ SetElementPtrSize<kTransactionActive, kCheckTransaction, kUnchecked>(
+ idx, reinterpret_cast<uintptr_t>(element), ptr_size);
}
template <VerifyObjectFlags kVerifyFlags, typename Visitor>
@@ -278,7 +278,9 @@ inline void PointerArray::Fixup(ObjPtr<mirror::PointerArray> dest,
void* ptr = GetElementPtrSize<void*, kVerifyFlags>(i, pointer_size);
void* new_ptr = visitor(ptr);
if (ptr != new_ptr) {
- dest->SetElementPtrSize<false, true>(i, new_ptr, pointer_size);
+ dest->SetElementPtrSize</*kActiveTransaction=*/ false,
+ /*kCheckTransaction=*/ true,
+ /*kUnchecked=*/ true>(i, new_ptr, pointer_size);
}
}
}