Index: runtime/vm/object.h |
diff --git a/runtime/vm/object.h b/runtime/vm/object.h |
index a37a146bd53da92bf88db05f726f2d161288e8d2..a54e2f7eab87d8669cb930aacd1af1a70b970167 100644 |
--- a/runtime/vm/object.h |
+++ b/runtime/vm/object.h |
@@ -245,9 +245,9 @@ class Object { |
RawObject* raw() const { return raw_; } |
void operator=(RawObject* value) { initializeHandle(this, value); } |
- uint32_t CompareAndSwapTags(uint32_t old_tags, uint32_t new_tags) const { |
- return AtomicOperations::CompareAndSwapUint32(&raw()->ptr()->tags_, |
- old_tags, new_tags); |
+ uword CompareAndSwapTags(uword old_tags, uword new_tags) const { |
+ return AtomicOperations::CompareAndSwapWord(&raw()->ptr()->tags_, old_tags, |
+ new_tags); |
} |
bool IsCanonical() const { return raw()->IsCanonical(); } |
void SetCanonical() const { raw()->SetCanonical(); } |
@@ -434,11 +434,13 @@ class Object { |
#if defined(HASH_IN_OBJECT_HEADER) |
static uint32_t GetCachedHash(const RawObject* obj) { |
- return obj->ptr()->hash_; |
+ uword tags = obj->ptr()->tags_; |
+ return tags >> 32; |
} |
- static void SetCachedHash(RawObject* obj, uint32_t hash) { |
- obj->ptr()->hash_ = hash; |
+ static void SetCachedHash(RawObject* obj, uintptr_t hash) { |
+ ASSERT(hash >> 32 == 0); |
+ obj->ptr()->tags_ |= hash << 32; |
} |
#endif |
@@ -6829,14 +6831,16 @@ class String : public Instance { |
return result; |
} |
- static intptr_t Hash(RawString* raw); |
- |
bool HasHash() const { |
ASSERT(Smi::New(0) == NULL); |
return GetCachedHash(raw()) != 0; |
} |
+#if defined(HASH_IN_OBJECT_HEADER) |
+ static intptr_t hash_offset() { return kInt32Size; } // Wrong for big-endian? |
+#else |
static intptr_t hash_offset() { return OFFSET_OF(RawString, hash_); } |
+#endif |
static intptr_t Hash(const String& str, intptr_t begin_index, intptr_t len); |
static intptr_t Hash(const char* characters, intptr_t len); |
static intptr_t Hash(const uint16_t* characters, intptr_t len); |