Index: runtime/vm/object.cc |
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc |
index 89640b8902568e0c1aa1fac78f9cda19612e5269..76f9a2a167a512c8dd5ffceb1e1f7e9fb18ec3b2 100644 |
--- a/runtime/vm/object.cc |
+++ b/runtime/vm/object.cc |
@@ -992,17 +992,10 @@ void Object::InitOnce(Isolate* isolate) { |
// An object visitor which will mark all visited objects. This is used to |
-// premark all objects in the vm_isolate_ heap. Also precalculates hash |
-// codes so that we can get the identity hash code of objects in the read- |
-// only VM isolate. |
-class FinalizeVMIsolateVisitor : public ObjectVisitor { |
+// premark all objects in the vm_isolate_ heap. |
+class PremarkingVisitor : public ObjectVisitor { |
public: |
- FinalizeVMIsolateVisitor() |
-#if defined(HASH_IN_OBJECT_HEADER) |
- : counter_(1337) |
-#endif |
- { |
- } |
+ PremarkingVisitor() {} |
void VisitObject(RawObject* obj) { |
// Free list elements should never be marked. |
@@ -1012,35 +1005,8 @@ class FinalizeVMIsolateVisitor : public ObjectVisitor { |
if (!obj->IsFreeListElement()) { |
ASSERT(obj->IsVMHeapObject()); |
obj->SetMarkBitUnsynchronized(); |
- if (obj->IsStringInstance()) { |
- RawString* str = reinterpret_cast<RawString*>(obj); |
- intptr_t hash = String::Hash(str); |
- String::SetCachedHash(str, hash); |
- } |
-#if defined(HASH_IN_OBJECT_HEADER) |
- // These objects end up in the read-only VM isolate which is shared |
- // between isolates, so we have to prepopulate them with identity hash |
- // codes, since we can't add hash codes later. |
- if (Object::GetCachedHash(obj) == 0) { |
- // Some classes have identity hash codes that depend on their contents, |
- // not per object. |
- ASSERT(!obj->IsStringInstance()); |
- if (!obj->IsMint() && !obj->IsDouble() && !obj->IsBigint() && |
- !obj->IsRawNull() && !obj->IsBool()) { |
- counter_ += 2011; // The year Dart was announced and a prime. |
- counter_ &= 0x3fffffff; |
- if (counter_ == 0) counter_++; |
- Object::SetCachedHash(obj, counter_); |
- } |
- } |
-#endif |
} |
} |
- |
- private: |
-#if defined(HASH_IN_OBJECT_HEADER) |
- int counter_; |
-#endif |
}; |
@@ -1120,7 +1086,7 @@ void Object::FinalizeVMIsolate(Isolate* isolate) { |
{ |
ASSERT(isolate == Dart::vm_isolate()); |
WritableVMIsolateScope scope(Thread::Current()); |
- FinalizeVMIsolateVisitor premarker; |
+ PremarkingVisitor premarker; |
ASSERT(isolate->heap()->UsedInWords(Heap::kNew) == 0); |
isolate->heap()->IterateOldObjectsNoImagePages(&premarker); |
// Make the VM isolate read-only again after setting all objects as marked. |
@@ -1155,15 +1121,13 @@ void Object::MakeUnusedSpaceTraversable(const Object& obj, |
reinterpret_cast<RawTypedData*>(RawObject::FromAddr(addr)); |
uword new_tags = RawObject::ClassIdTag::update(kTypedDataInt8ArrayCid, 0); |
new_tags = RawObject::SizeTag::update(leftover_size, new_tags); |
- uint32_t tags = raw->ptr()->tags_; |
- uint32_t old_tags; |
+ uword tags = raw->ptr()->tags_; |
+ uword old_tags; |
// TODO(iposva): Investigate whether CompareAndSwapWord is necessary. |
do { |
old_tags = tags; |
- // We can't use obj.CompareAndSwapTags here because we don't have a |
- // handle for the new object. |
- tags = AtomicOperations::CompareAndSwapUint32(&raw->ptr()->tags_, |
- old_tags, new_tags); |
+ tags = AtomicOperations::CompareAndSwapWord(&raw->ptr()->tags_, |
+ old_tags, new_tags); |
} while (tags != old_tags); |
intptr_t leftover_len = (leftover_size - TypedData::InstanceSize(0)); |
@@ -1175,12 +1139,13 @@ void Object::MakeUnusedSpaceTraversable(const Object& obj, |
RawObject* raw = reinterpret_cast<RawObject*>(RawObject::FromAddr(addr)); |
uword new_tags = RawObject::ClassIdTag::update(kInstanceCid, 0); |
new_tags = RawObject::SizeTag::update(leftover_size, new_tags); |
- uint32_t tags = raw->ptr()->tags_; |
- uint32_t old_tags; |
+ uword tags = raw->ptr()->tags_; |
+ uword old_tags; |
// TODO(iposva): Investigate whether CompareAndSwapWord is necessary. |
do { |
old_tags = tags; |
- tags = obj.CompareAndSwapTags(old_tags, new_tags); |
+ tags = AtomicOperations::CompareAndSwapWord(&raw->ptr()->tags_, |
+ old_tags, new_tags); |
} while (tags != old_tags); |
} |
} |
@@ -1902,15 +1867,12 @@ void Object::InitializeObject(uword address, |
*reinterpret_cast<uword*>(cur) = initial_value; |
cur += kWordSize; |
} |
- uint32_t tags = 0; |
+ uword tags = 0; |
ASSERT(class_id != kIllegalCid); |
tags = RawObject::ClassIdTag::update(class_id, tags); |
tags = RawObject::SizeTag::update(size, tags); |
tags = RawObject::VMHeapObjectTag::update(is_vm_object, tags); |
reinterpret_cast<RawObject*>(address)->tags_ = tags; |
-#if defined(HASH_IN_OBJECT_HEADER) |
- reinterpret_cast<RawObject*>(address)->hash_ = 0; |
-#endif |
ASSERT(is_vm_object == RawObject::IsVMHeapObject(tags)); |
} |
@@ -20365,35 +20327,6 @@ static intptr_t HashImpl(const T* characters, intptr_t len) { |
} |
-intptr_t String::Hash(RawString* raw) { |
- StringHasher hasher; |
- uword length = Smi::Value(raw->ptr()->length_); |
- if (raw->IsOneByteString() || raw->IsExternalOneByteString()) { |
- const uint8_t* data; |
- if (raw->IsOneByteString()) { |
- data = reinterpret_cast<RawOneByteString*>(raw)->ptr()->data(); |
- } else { |
- ASSERT(raw->IsExternalOneByteString()); |
- RawExternalOneByteString* str = |
- reinterpret_cast<RawExternalOneByteString*>(raw); |
- data = str->ptr()->external_data_->data(); |
- } |
- return String::Hash(data, length); |
- } else { |
- const uint16_t* data; |
- if (raw->IsTwoByteString()) { |
- data = reinterpret_cast<RawTwoByteString*>(raw)->ptr()->data(); |
- } else { |
- ASSERT(raw->IsExternalTwoByteString()); |
- RawExternalTwoByteString* str = |
- reinterpret_cast<RawExternalTwoByteString*>(raw); |
- data = str->ptr()->external_data_->data(); |
- } |
- return String::Hash(data, length); |
- } |
-} |
- |
- |
intptr_t String::Hash(const char* characters, intptr_t len) { |
return HashImpl(characters, len); |
} |
@@ -21214,11 +21147,11 @@ RawString* String::MakeExternal(void* array, |
// Update the class information of the object. |
const intptr_t class_id = kExternalOneByteStringCid; |
- uint32_t tags = raw_ptr()->tags_; |
- uint32_t old_tags; |
+ uword tags = raw_ptr()->tags_; |
+ uword old_tags; |
do { |
old_tags = tags; |
- uint32_t new_tags = RawObject::SizeTag::update(used_size, old_tags); |
+ uword new_tags = RawObject::SizeTag::update(used_size, old_tags); |
new_tags = RawObject::ClassIdTag::update(class_id, new_tags); |
tags = CompareAndSwapTags(old_tags, new_tags); |
} while (tags != old_tags); |
@@ -21251,11 +21184,11 @@ RawString* String::MakeExternal(void* array, |
// Update the class information of the object. |
const intptr_t class_id = kExternalTwoByteStringCid; |
- uint32_t tags = raw_ptr()->tags_; |
- uint32_t old_tags; |
+ uword tags = raw_ptr()->tags_; |
+ uword old_tags; |
do { |
old_tags = tags; |
- uint32_t new_tags = RawObject::SizeTag::update(used_size, old_tags); |
+ uword new_tags = RawObject::SizeTag::update(used_size, old_tags); |
new_tags = RawObject::ClassIdTag::update(class_id, new_tags); |
tags = CompareAndSwapTags(old_tags, new_tags); |
} while (tags != old_tags); |
@@ -22143,11 +22076,11 @@ void Array::MakeImmutable() const { |
if (IsImmutable()) return; |
ASSERT(!IsCanonical()); |
NoSafepointScope no_safepoint; |
- uint32_t tags = raw_ptr()->tags_; |
- uint32_t old_tags; |
+ uword tags = raw_ptr()->tags_; |
+ uword old_tags; |
do { |
old_tags = tags; |
- uint32_t new_tags = |
+ uword new_tags = |
RawObject::ClassIdTag::update(kImmutableArrayCid, old_tags); |
tags = CompareAndSwapTags(old_tags, new_tags); |
} while (tags != old_tags); |
@@ -22189,7 +22122,6 @@ RawArray* Array::Grow(const Array& source, |
RawArray* Array::MakeArray(const GrowableObjectArray& growable_array) { |
ASSERT(!growable_array.IsNull()); |
- ASSERT(growable_array.IsGrowableObjectArray()); |
intptr_t used_len = growable_array.Length(); |
// Get the type arguments and prepare to copy them. |
const TypeArguments& type_arguments = |
@@ -22202,7 +22134,6 @@ RawArray* Array::MakeArray(const GrowableObjectArray& growable_array) { |
intptr_t capacity_len = growable_array.Capacity(); |
Zone* zone = Thread::Current()->zone(); |
const Array& array = Array::Handle(zone, growable_array.data()); |
- ASSERT(array.IsArray()); |
array.SetTypeArguments(type_arguments); |
intptr_t capacity_size = Array::InstanceSize(capacity_len); |
intptr_t used_size = Array::InstanceSize(used_len); |
@@ -22216,10 +22147,10 @@ RawArray* Array::MakeArray(const GrowableObjectArray& growable_array) { |
// Update the size in the header field and length of the array object. |
uword tags = array.raw_ptr()->tags_; |
ASSERT(kArrayCid == RawObject::ClassIdTag::decode(tags)); |
- uint32_t old_tags; |
+ uword old_tags; |
do { |
old_tags = tags; |
- uint32_t new_tags = RawObject::SizeTag::update(used_size, old_tags); |
+ uword new_tags = RawObject::SizeTag::update(used_size, old_tags); |
tags = array.CompareAndSwapTags(old_tags, new_tags); |
} while (tags != old_tags); |
// TODO(22501): For the heap to remain walkable by the sweeper, it must |