Fix Object::Clone()'s pre-fence barrier.
Pass in a pre-fence barrier object that sets in the array length
instead of setting it after returning from AllocObject().
Fix another potential bug due to the wrong default pre-fence barrier
parameter value. Since this appears error-prone, removed the default
parameter value and make it an explicit parameter.
Fix another potential moving GC bug due to a lack of a SirtRef.
Bug: 13097759
Change-Id: I466aa0e50f9e1a5dbf20be5a195edee619c7514e
diff --git a/runtime/sirt_ref-inl.h b/runtime/sirt_ref-inl.h
index 7f2d847..7de624a 100644
--- a/runtime/sirt_ref-inl.h
+++ b/runtime/sirt_ref-inl.h
@@ -23,8 +23,11 @@
namespace art {
-template<class T> inline SirtRef<T>::SirtRef(Thread* self, T* object) : self_(self), sirt_(object) {
- VerifyObject(object);
+template<class T> inline SirtRef<T>::SirtRef(Thread* self, T* object, bool should_verify)
+ : self_(self), sirt_(object) {
+ if (should_verify) {
+ VerifyObject(object);
+ }
self_->PushSirt(&sirt_);
}
@@ -33,8 +36,10 @@
DCHECK_EQ(top_sirt, &sirt_);
}
-template<class T> inline T* SirtRef<T>::reset(T* object) {
- VerifyObject(object);
+template<class T> inline T* SirtRef<T>::reset(T* object, bool should_verify) {
+ if (should_verify) {
+ VerifyObject(object);
+ }
T* old_ref = get();
sirt_.SetReference(0, object);
return old_ref;