Make primitive getter/setters consistently signed.
Use QuasiAtomic for Cas64, which fixes the MIPS build of ART.
Change-Id: Id1dba264b148a7ce9bcc637159ec733cfbd88b70
diff --git a/runtime/mirror/object-inl.h b/runtime/mirror/object-inl.h
index afa4112..b994354 100644
--- a/runtime/mirror/object-inl.h
+++ b/runtime/mirror/object-inl.h
@@ -240,7 +240,7 @@
return result;
}
-inline uint32_t Object::GetField32(MemberOffset field_offset, bool is_volatile) {
+inline int32_t Object::GetField32(MemberOffset field_offset, bool is_volatile) {
VerifyObject(this);
const byte* raw_addr = reinterpret_cast<const byte*>(this) + field_offset.Int32Value();
const int32_t* word_addr = reinterpret_cast<const int32_t*>(raw_addr);
@@ -253,13 +253,13 @@
}
}
-inline void Object::SetField32(MemberOffset field_offset, uint32_t new_value, bool is_volatile,
+inline void Object::SetField32(MemberOffset field_offset, int32_t new_value, bool is_volatile,
bool this_is_valid) {
if (this_is_valid) {
VerifyObject(this);
}
byte* raw_addr = reinterpret_cast<byte*>(this) + field_offset.Int32Value();
- uint32_t* word_addr = reinterpret_cast<uint32_t*>(raw_addr);
+ int32_t* word_addr = reinterpret_cast<int32_t*>(raw_addr);
if (UNLIKELY(is_volatile)) {
QuasiAtomic::MembarStoreStore(); // Ensure this store occurs after others in the queue.
*word_addr = new_value;
@@ -269,19 +269,19 @@
}
}
-inline bool Object::CasField32(MemberOffset field_offset, uint32_t old_value, uint32_t new_value) {
+inline bool Object::CasField32(MemberOffset field_offset, int32_t old_value, int32_t new_value) {
VerifyObject(this);
byte* raw_addr = reinterpret_cast<byte*>(this) + field_offset.Int32Value();
- volatile uint32_t* addr = reinterpret_cast<volatile uint32_t*>(raw_addr);
+ volatile int32_t* addr = reinterpret_cast<volatile int32_t*>(raw_addr);
return __sync_bool_compare_and_swap(addr, old_value, new_value);
}
-inline uint64_t Object::GetField64(MemberOffset field_offset, bool is_volatile) {
+inline int64_t Object::GetField64(MemberOffset field_offset, bool is_volatile) {
VerifyObject(this);
const byte* raw_addr = reinterpret_cast<const byte*>(this) + field_offset.Int32Value();
const int64_t* addr = reinterpret_cast<const int64_t*>(raw_addr);
if (UNLIKELY(is_volatile)) {
- uint64_t result = QuasiAtomic::Read64(addr);
+ int64_t result = QuasiAtomic::Read64(addr);
QuasiAtomic::MembarLoadLoad(); // Ensure volatile loads don't re-order.
return result;
} else {
@@ -289,7 +289,7 @@
}
}
-inline void Object::SetField64(MemberOffset field_offset, uint64_t new_value, bool is_volatile,
+inline void Object::SetField64(MemberOffset field_offset, int64_t new_value, bool is_volatile,
bool this_is_valid) {
if (this_is_valid) {
VerifyObject(this);
@@ -309,11 +309,11 @@
}
}
-inline bool Object::CasField64(MemberOffset field_offset, uint64_t old_value, uint64_t new_value) {
+inline bool Object::CasField64(MemberOffset field_offset, int64_t old_value, int64_t new_value) {
VerifyObject(this);
byte* raw_addr = reinterpret_cast<byte*>(this) + field_offset.Int32Value();
- volatile uint64_t* addr = reinterpret_cast<volatile uint64_t*>(raw_addr);
- return __sync_bool_compare_and_swap(addr, old_value, new_value);
+ volatile int64_t* addr = reinterpret_cast<volatile int64_t*>(raw_addr);
+ return QuasiAtomic::Cas64(old_value, new_value, addr);
}
template<class T>
@@ -361,7 +361,7 @@
inline bool Object::CasFieldObject(MemberOffset field_offset, Object* old_value, Object* new_value) {
VerifyObject(this);
byte* raw_addr = reinterpret_cast<byte*>(this) + field_offset.Int32Value();
- volatile uint32_t* addr = reinterpret_cast<volatile uint32_t*>(raw_addr);
+ volatile int32_t* addr = reinterpret_cast<volatile int32_t*>(raw_addr);
HeapReference<Object> old_ref(HeapReference<Object>::FromMirrorPtr(old_value));
HeapReference<Object> new_ref(HeapReference<Object>::FromMirrorPtr(new_value));
bool success = __sync_bool_compare_and_swap(addr, old_ref.reference_, new_ref.reference_);
diff --git a/runtime/mirror/object.h b/runtime/mirror/object.h
index 6fe8b73..c42750f 100644
--- a/runtime/mirror/object.h
+++ b/runtime/mirror/object.h
@@ -170,29 +170,29 @@
field_offset.Int32Value());
}
- uint32_t GetField32(MemberOffset field_offset, bool is_volatile);
+ int32_t GetField32(MemberOffset field_offset, bool is_volatile);
- void SetField32(MemberOffset field_offset, uint32_t new_value, bool is_volatile,
+ void SetField32(MemberOffset field_offset, int32_t new_value, bool is_volatile,
bool this_is_valid = true);
- bool CasField32(MemberOffset field_offset, uint32_t old_value, uint32_t new_value)
+ bool CasField32(MemberOffset field_offset, int32_t old_value, int32_t new_value)
SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
- uint64_t GetField64(MemberOffset field_offset, bool is_volatile);
+ int64_t GetField64(MemberOffset field_offset, bool is_volatile);
- void SetField64(MemberOffset field_offset, uint64_t new_value, bool is_volatile,
+ void SetField64(MemberOffset field_offset, int64_t new_value, bool is_volatile,
bool this_is_valid = true);
- bool CasField64(MemberOffset field_offset, uint64_t old_value, uint64_t new_value)
+ bool CasField64(MemberOffset field_offset, int64_t old_value, int64_t new_value)
SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
template<typename T>
void SetFieldPtr(MemberOffset field_offset, T new_value, bool is_volatile,
bool this_is_valid = true) {
#ifndef __LP64__
- SetField32(field_offset, reinterpret_cast<uint32_t>(new_value), is_volatile, this_is_valid);
+ SetField32(field_offset, reinterpret_cast<int32_t>(new_value), is_volatile, this_is_valid);
#else
- SetField64(field_offset, reinterpret_cast<uint64_t>(new_value), is_volatile, this_is_valid);
+ SetField64(field_offset, reinterpret_cast<int64_t>(new_value), is_volatile, this_is_valid);
#endif
}
diff --git a/runtime/mirror/string.h b/runtime/mirror/string.h
index a82b26c..406c5a3 100644
--- a/runtime/mirror/string.h
+++ b/runtime/mirror/string.h
@@ -112,7 +112,7 @@
private:
void SetHashCode(int32_t new_hash_code) {
- DCHECK_EQ(0u, GetField32(OFFSET_OF_OBJECT_MEMBER(String, hash_code_), false));
+ DCHECK_EQ(0, GetField32(OFFSET_OF_OBJECT_MEMBER(String, hash_code_), false));
SetField32(OFFSET_OF_OBJECT_MEMBER(String, hash_code_), new_hash_code, false);
}