Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(238)

Side by Side Diff: src/objects-inl.h

Issue 1156993018: GlobalDictionary now stores PropertyDetails in PropertyCells. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/objects.cc ('k') | src/runtime/runtime-object.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 // 4 //
5 // Review notes: 5 // Review notes:
6 // 6 //
7 // - The use of macros in these inline functions may seem superfluous 7 // - The use of macros in these inline functions may seem superfluous
8 // but it is absolutely needed to make sure gcc generates optimal 8 // but it is absolutely needed to make sure gcc generates optimal
9 // code. gcc is not happy when attempting to inline too deep. 9 // code. gcc is not happy when attempting to inline too deep.
10 // 10 //
(...skipping 1910 matching lines...) Expand 10 before | Expand all | Expand 10 after
1921 } 1921 }
1922 1922
1923 1923
1924 void Oddball::set_kind(byte value) { 1924 void Oddball::set_kind(byte value) {
1925 WRITE_FIELD(this, kKindOffset, Smi::FromInt(value)); 1925 WRITE_FIELD(this, kKindOffset, Smi::FromInt(value));
1926 } 1926 }
1927 1927
1928 1928
1929 ACCESSORS(Cell, value, Object, kValueOffset) 1929 ACCESSORS(Cell, value, Object, kValueOffset)
1930 ACCESSORS(PropertyCell, dependent_code, DependentCode, kDependentCodeOffset) 1930 ACCESSORS(PropertyCell, dependent_code, DependentCode, kDependentCodeOffset)
1931 ACCESSORS(PropertyCell, property_details_raw, Object, kDetailsOffset)
1931 ACCESSORS(PropertyCell, value, Object, kValueOffset) 1932 ACCESSORS(PropertyCell, value, Object, kValueOffset)
1932 1933
1933 Object* WeakCell::value() const { return READ_FIELD(this, kValueOffset); } 1934 Object* WeakCell::value() const { return READ_FIELD(this, kValueOffset); }
1934 1935
1935 1936
1936 void WeakCell::clear() { 1937 void WeakCell::clear() {
1937 DCHECK(GetHeap()->gc_state() == Heap::MARK_COMPACT); 1938 DCHECK(GetHeap()->gc_state() == Heap::MARK_COMPACT);
1938 WRITE_FIELD(this, kValueOffset, Smi::FromInt(0)); 1939 WRITE_FIELD(this, kValueOffset, Smi::FromInt(0));
1939 } 1940 }
1940 1941
(...skipping 5174 matching lines...) Expand 10 before | Expand all | Expand 10 after
7115 reinterpret_cast<v8::internal::Address>( 7116 reinterpret_cast<v8::internal::Address>(
7116 reinterpret_cast<intptr_t>(nullptr))); 7117 reinterpret_cast<intptr_t>(nullptr)));
7117 info->set_setter(*foreign); 7118 info->set_setter(*foreign);
7118 } 7119 }
7119 7120
7120 7121
7121 template<typename Derived, typename Shape, typename Key> 7122 template<typename Derived, typename Shape, typename Key>
7122 void Dictionary<Derived, Shape, Key>::SetEntry(int entry, 7123 void Dictionary<Derived, Shape, Key>::SetEntry(int entry,
7123 Handle<Object> key, 7124 Handle<Object> key,
7124 Handle<Object> value) { 7125 Handle<Object> value) {
7125 SetEntry(entry, key, value, PropertyDetails(Smi::FromInt(0))); 7126 this->SetEntry(entry, key, value, PropertyDetails(Smi::FromInt(0)));
7126 } 7127 }
7127 7128
7128 7129
7129 template<typename Derived, typename Shape, typename Key> 7130 template<typename Derived, typename Shape, typename Key>
7130 void Dictionary<Derived, Shape, Key>::SetEntry(int entry, 7131 void Dictionary<Derived, Shape, Key>::SetEntry(int entry,
7131 Handle<Object> key, 7132 Handle<Object> key,
7132 Handle<Object> value, 7133 Handle<Object> value,
7133 PropertyDetails details) { 7134 PropertyDetails details) {
7134 DCHECK(!key->IsName() || details.dictionary_index() > 0); 7135 Shape::SetEntry(static_cast<Derived*>(this), entry, key, value, details);
7135 int index = DerivedHashTable::EntryToIndex(entry);
7136 DisallowHeapAllocation no_gc;
7137 WriteBarrierMode mode = FixedArray::GetWriteBarrierMode(no_gc);
7138 FixedArray::set(index, *key, mode);
7139 FixedArray::set(index+1, *value, mode);
7140 FixedArray::set(index+2, details.AsSmi());
7141 } 7136 }
7142 7137
7143 7138
7139 template <typename Key>
7140 template <typename Dictionary>
7141 void BaseDictionaryShape<Key>::SetEntry(Dictionary* dict, int entry,
7142 Handle<Object> key,
7143 Handle<Object> value,
7144 PropertyDetails details) {
7145 STATIC_ASSERT(Dictionary::kEntrySize == 3);
7146 DCHECK(!key->IsName() || details.dictionary_index() > 0);
7147 int index = dict->EntryToIndex(entry);
7148 DisallowHeapAllocation no_gc;
7149 WriteBarrierMode mode = dict->GetWriteBarrierMode(no_gc);
7150 dict->set(index, *key, mode);
7151 dict->set(index + 1, *value, mode);
7152 dict->set(index + 2, details.AsSmi());
7153 }
7154
7155
7156 template <typename Dictionary>
7157 void GlobalDictionaryShape::SetEntry(Dictionary* dict, int entry,
7158 Handle<Object> key, Handle<Object> value,
7159 PropertyDetails details) {
7160 STATIC_ASSERT(Dictionary::kEntrySize == 2);
7161 DCHECK(!key->IsName() || details.dictionary_index() > 0);
7162 DCHECK(value->IsPropertyCell());
7163 int index = dict->EntryToIndex(entry);
7164 DisallowHeapAllocation no_gc;
7165 WriteBarrierMode mode = dict->GetWriteBarrierMode(no_gc);
7166 dict->set(index, *key, mode);
7167 dict->set(index + 1, *value, mode);
7168 PropertyCell::cast(*value)->set_property_details(details);
7169 }
7170
7171
7144 bool NumberDictionaryShape::IsMatch(uint32_t key, Object* other) { 7172 bool NumberDictionaryShape::IsMatch(uint32_t key, Object* other) {
7145 DCHECK(other->IsNumber()); 7173 DCHECK(other->IsNumber());
7146 return key == static_cast<uint32_t>(other->Number()); 7174 return key == static_cast<uint32_t>(other->Number());
7147 } 7175 }
7148 7176
7149 7177
7150 uint32_t UnseededNumberDictionaryShape::Hash(uint32_t key) { 7178 uint32_t UnseededNumberDictionaryShape::Hash(uint32_t key) {
7151 return ComputeIntegerHash(key, 0); 7179 return ComputeIntegerHash(key, 0);
7152 } 7180 }
7153 7181
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
7202 } 7230 }
7203 7231
7204 7232
7205 Handle<FixedArray> NameDictionary::DoGenerateNewEnumerationIndices( 7233 Handle<FixedArray> NameDictionary::DoGenerateNewEnumerationIndices(
7206 Handle<NameDictionary> dictionary) { 7234 Handle<NameDictionary> dictionary) {
7207 return DerivedDictionary::GenerateNewEnumerationIndices(dictionary); 7235 return DerivedDictionary::GenerateNewEnumerationIndices(dictionary);
7208 } 7236 }
7209 7237
7210 7238
7211 template <typename Dictionary> 7239 template <typename Dictionary>
7240 PropertyDetails GlobalDictionaryShape::DetailsAt(Dictionary* dict, int entry) {
7241 DCHECK(entry >= 0); // Not found is -1, which is not caught by get().
7242 Object* raw_value = dict->ValueAt(entry);
7243 CHECK(raw_value->IsPropertyCell());
Jakob Kummerow 2015/06/02 07:18:09 Do we need to keep this CHECK forever? Maybe add a
Igor Sheludko 2015/06/02 09:57:14 Done.
7244 PropertyCell* cell = PropertyCell::cast(raw_value);
7245 return cell->property_details();
7246 }
7247
7248
7249 template <typename Dictionary>
7250 void GlobalDictionaryShape::DetailsAtPut(Dictionary* dict, int entry,
7251 PropertyDetails value) {
7252 DCHECK(entry >= 0); // Not found is -1, which is not caught by get().
7253 Object* raw_value = dict->ValueAt(entry);
7254 CHECK(raw_value->IsPropertyCell());
7255 PropertyCell* cell = PropertyCell::cast(raw_value);
7256 cell->set_property_details(value);
7257 }
7258
7259
7260 template <typename Dictionary>
7212 bool GlobalDictionaryShape::IsDeleted(Dictionary* dict, int entry) { 7261 bool GlobalDictionaryShape::IsDeleted(Dictionary* dict, int entry) {
7213 DCHECK(dict->ValueAt(entry)->IsPropertyCell()); 7262 DCHECK(dict->ValueAt(entry)->IsPropertyCell());
7214 return PropertyCell::cast(dict->ValueAt(entry))->value()->IsTheHole(); 7263 return PropertyCell::cast(dict->ValueAt(entry))->value()->IsTheHole();
7215 } 7264 }
7216 7265
7217 7266
7218 bool ObjectHashTableShape::IsMatch(Handle<Object> key, Object* other) { 7267 bool ObjectHashTableShape::IsMatch(Handle<Object> key, Object* other) {
7219 return key->SameValue(other); 7268 return key->SameValue(other);
7220 } 7269 }
7221 7270
(...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after
7660 #undef READ_SHORT_FIELD 7709 #undef READ_SHORT_FIELD
7661 #undef WRITE_SHORT_FIELD 7710 #undef WRITE_SHORT_FIELD
7662 #undef READ_BYTE_FIELD 7711 #undef READ_BYTE_FIELD
7663 #undef WRITE_BYTE_FIELD 7712 #undef WRITE_BYTE_FIELD
7664 #undef NOBARRIER_READ_BYTE_FIELD 7713 #undef NOBARRIER_READ_BYTE_FIELD
7665 #undef NOBARRIER_WRITE_BYTE_FIELD 7714 #undef NOBARRIER_WRITE_BYTE_FIELD
7666 7715
7667 } } // namespace v8::internal 7716 } } // namespace v8::internal
7668 7717
7669 #endif // V8_OBJECTS_INL_H_ 7718 #endif // V8_OBJECTS_INL_H_
OLDNEW
« no previous file with comments | « src/objects.cc ('k') | src/runtime/runtime-object.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698