Insert read barriers in more places.
Bug: 12687968
Change-Id: If3ffca4741e039f314ac848551c481d44cbcd3ca
diff --git a/runtime/mirror/object_array-inl.h b/runtime/mirror/object_array-inl.h
index 8032cc3..e0c14c3 100644
--- a/runtime/mirror/object_array-inl.h
+++ b/runtime/mirror/object_array-inl.h
@@ -128,7 +128,27 @@
CHECK_EQ(sizeof(HeapReference<T>), sizeof(uint32_t));
IntArray* dstAsIntArray = reinterpret_cast<IntArray*>(this);
IntArray* srcAsIntArray = reinterpret_cast<IntArray*>(src);
- dstAsIntArray->Memmove(dst_pos, srcAsIntArray, src_pos, count);
+ if (kUseBakerOrBrooksReadBarrier) {
+ // TODO: Optimize this later?
+ const bool copy_forward = (src != this) || (dst_pos < src_pos) || (dst_pos - src_pos >= count);
+ if (copy_forward) {
+ // Forward copy.
+ for (int i = 0; i < count; ++i) {
+ // We need a RB here. ObjectArray::GetWithoutChecks() contains a RB.
+ Object* obj = src->GetWithoutChecks(src_pos + i);
+ SetWithoutChecks<false>(dst_pos + i, obj);
+ }
+ } else {
+ // Backward copy.
+ for (int i = count - 1; i >= 0; --i) {
+ // We need a RB here. ObjectArray::GetWithoutChecks() contains a RB.
+ Object* obj = src->GetWithoutChecks(src_pos + i);
+ SetWithoutChecks<false>(dst_pos + i, obj);
+ }
+ }
+ } else {
+ dstAsIntArray->Memmove(dst_pos, srcAsIntArray, src_pos, count);
+ }
Runtime::Current()->GetHeap()->WriteBarrierArray(this, dst_pos, count);
if (kIsDebugBuild) {
for (int i = 0; i < count; ++i) {
@@ -151,7 +171,16 @@
CHECK_EQ(sizeof(HeapReference<T>), sizeof(uint32_t));
IntArray* dstAsIntArray = reinterpret_cast<IntArray*>(this);
IntArray* srcAsIntArray = reinterpret_cast<IntArray*>(src);
- dstAsIntArray->Memcpy(dst_pos, srcAsIntArray, src_pos, count);
+ if (kUseBakerOrBrooksReadBarrier) {
+ // TODO: Optimize this later?
+ for (int i = 0; i < count; ++i) {
+ // We need a RB here. ObjectArray::GetWithoutChecks() contains a RB.
+ T* obj = src->GetWithoutChecks(src_pos + i);
+ SetWithoutChecks<false>(dst_pos + i, obj);
+ }
+ } else {
+ dstAsIntArray->Memcpy(dst_pos, srcAsIntArray, src_pos, count);
+ }
Runtime::Current()->GetHeap()->WriteBarrierArray(this, dst_pos, count);
if (kIsDebugBuild) {
for (int i = 0; i < count; ++i) {
@@ -176,6 +205,7 @@
int i = 0;
for (; i < count; ++i) {
// The follow get operations force the objects to be verified.
+ // We need a RB here. ObjectArray::GetWithoutChecks() contains a RB.
o = src->GetWithoutChecks(src_pos + i);
if (o == nullptr) {
// Null is always assignable.