Index: src/objects-inl.h |
diff --git a/src/objects-inl.h b/src/objects-inl.h |
index 12e30481d8e0723de87c6cfb82f648b1251e0d95..b21c900c1633a646fb6102dcf22d81c96cd46678 100644 |
--- a/src/objects-inl.h |
+++ b/src/objects-inl.h |
@@ -1930,6 +1930,7 @@ void Oddball::set_kind(byte value) { |
ACCESSORS(Cell, value, Object, kValueOffset) |
ACCESSORS(PropertyCell, dependent_code, DependentCode, kDependentCodeOffset) |
+ACCESSORS(PropertyCell, property_details_raw, Object, kDetailsOffset) |
ACCESSORS(PropertyCell, value, Object, kValueOffset) |
Object* WeakCell::value() const { return READ_FIELD(this, kValueOffset); } |
@@ -7124,7 +7125,7 @@ template<typename Derived, typename Shape, typename Key> |
void Dictionary<Derived, Shape, Key>::SetEntry(int entry, |
Handle<Object> key, |
Handle<Object> value) { |
- SetEntry(entry, key, value, PropertyDetails(Smi::FromInt(0))); |
+ this->SetEntry(entry, key, value, PropertyDetails(Smi::FromInt(0))); |
} |
@@ -7133,13 +7134,40 @@ void Dictionary<Derived, Shape, Key>::SetEntry(int entry, |
Handle<Object> key, |
Handle<Object> value, |
PropertyDetails details) { |
+ Shape::SetEntry(static_cast<Derived*>(this), entry, key, value, details); |
+} |
+ |
+ |
+template <typename Key> |
+template <typename Dictionary> |
+void BaseDictionaryShape<Key>::SetEntry(Dictionary* dict, int entry, |
+ Handle<Object> key, |
+ Handle<Object> value, |
+ PropertyDetails details) { |
+ STATIC_ASSERT(Dictionary::kEntrySize == 3); |
+ DCHECK(!key->IsName() || details.dictionary_index() > 0); |
+ int index = dict->EntryToIndex(entry); |
+ DisallowHeapAllocation no_gc; |
+ WriteBarrierMode mode = dict->GetWriteBarrierMode(no_gc); |
+ dict->set(index, *key, mode); |
+ dict->set(index + 1, *value, mode); |
+ dict->set(index + 2, details.AsSmi()); |
+} |
+ |
+ |
+template <typename Dictionary> |
+void GlobalDictionaryShape::SetEntry(Dictionary* dict, int entry, |
+ Handle<Object> key, Handle<Object> value, |
+ PropertyDetails details) { |
+ STATIC_ASSERT(Dictionary::kEntrySize == 2); |
DCHECK(!key->IsName() || details.dictionary_index() > 0); |
- int index = DerivedHashTable::EntryToIndex(entry); |
+ DCHECK(value->IsPropertyCell()); |
+ int index = dict->EntryToIndex(entry); |
DisallowHeapAllocation no_gc; |
- WriteBarrierMode mode = FixedArray::GetWriteBarrierMode(no_gc); |
- FixedArray::set(index, *key, mode); |
- FixedArray::set(index+1, *value, mode); |
- FixedArray::set(index+2, details.AsSmi()); |
+ WriteBarrierMode mode = dict->GetWriteBarrierMode(no_gc); |
+ dict->set(index, *key, mode); |
+ dict->set(index + 1, *value, mode); |
+ PropertyCell::cast(*value)->set_property_details(details); |
} |
@@ -7211,6 +7239,27 @@ Handle<FixedArray> NameDictionary::DoGenerateNewEnumerationIndices( |
template <typename Dictionary> |
+PropertyDetails GlobalDictionaryShape::DetailsAt(Dictionary* dict, int entry) { |
+ DCHECK(entry >= 0); // Not found is -1, which is not caught by get(). |
+ Object* raw_value = dict->ValueAt(entry); |
+ DCHECK(raw_value->IsPropertyCell()); |
+ PropertyCell* cell = PropertyCell::cast(raw_value); |
+ return cell->property_details(); |
+} |
+ |
+ |
+template <typename Dictionary> |
+void GlobalDictionaryShape::DetailsAtPut(Dictionary* dict, int entry, |
+ PropertyDetails value) { |
+ DCHECK(entry >= 0); // Not found is -1, which is not caught by get(). |
+ Object* raw_value = dict->ValueAt(entry); |
+ DCHECK(raw_value->IsPropertyCell()); |
+ PropertyCell* cell = PropertyCell::cast(raw_value); |
+ cell->set_property_details(value); |
+} |
+ |
+ |
+template <typename Dictionary> |
bool GlobalDictionaryShape::IsDeleted(Dictionary* dict, int entry) { |
DCHECK(dict->ValueAt(entry)->IsPropertyCell()); |
return PropertyCell::cast(dict->ValueAt(entry))->value()->IsTheHole(); |