OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 #include <iomanip> | 5 #include <iomanip> |
6 #include <sstream> | 6 #include <sstream> |
7 | 7 |
8 #include "src/v8.h" | 8 #include "src/v8.h" |
9 | 9 |
10 #include "src/accessors.h" | 10 #include "src/accessors.h" |
(...skipping 536 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
547 store_value = object->GetIsolate()->factory()->NewPropertyCell(value); | 547 store_value = object->GetIsolate()->factory()->NewPropertyCell(value); |
548 } | 548 } |
549 | 549 |
550 property_dictionary = NameDictionary::Add( | 550 property_dictionary = NameDictionary::Add( |
551 property_dictionary, name, store_value, details); | 551 property_dictionary, name, store_value, details); |
552 object->set_properties(*property_dictionary); | 552 object->set_properties(*property_dictionary); |
553 return; | 553 return; |
554 } | 554 } |
555 | 555 |
556 PropertyDetails original_details = property_dictionary->DetailsAt(entry); | 556 PropertyDetails original_details = property_dictionary->DetailsAt(entry); |
557 int enumeration_index; | 557 int enumeration_index = original_details.dictionary_index(); |
| 558 |
| 559 if (!object->IsGlobalObject()) { |
| 560 DCHECK(enumeration_index > 0); |
| 561 details = PropertyDetails(details.attributes(), details.type(), |
| 562 enumeration_index); |
| 563 property_dictionary->SetEntry(entry, name, value, details); |
| 564 return; |
| 565 } |
| 566 |
| 567 Handle<PropertyCell> cell( |
| 568 PropertyCell::cast(property_dictionary->ValueAt(entry))); |
558 // Preserve the enumeration index unless the property was deleted. | 569 // Preserve the enumeration index unless the property was deleted. |
559 if (original_details.IsDeleted()) { | 570 if (cell->value()->IsTheHole()) { |
560 enumeration_index = property_dictionary->NextEnumerationIndex(); | 571 enumeration_index = property_dictionary->NextEnumerationIndex(); |
561 property_dictionary->SetNextEnumerationIndex(enumeration_index + 1); | 572 property_dictionary->SetNextEnumerationIndex(enumeration_index + 1); |
562 } else { | |
563 enumeration_index = original_details.dictionary_index(); | |
564 DCHECK(enumeration_index > 0); | |
565 } | 573 } |
566 | 574 DCHECK(enumeration_index > 0); |
567 details = PropertyDetails( | 575 details = PropertyDetails( |
568 details.attributes(), details.type(), enumeration_index); | 576 details.attributes(), details.type(), enumeration_index); |
569 | 577 PropertyCell::SetValueInferType(cell, value); |
570 if (object->IsGlobalObject()) { | 578 // Please note we have to update the property details. |
571 Handle<PropertyCell> cell( | 579 property_dictionary->DetailsAtPut(entry, details); |
572 PropertyCell::cast(property_dictionary->ValueAt(entry))); | |
573 PropertyCell::SetValueInferType(cell, value); | |
574 // Please note we have to update the property details. | |
575 property_dictionary->DetailsAtPut(entry, details); | |
576 } else { | |
577 property_dictionary->SetEntry(entry, name, value, details); | |
578 } | |
579 } | 580 } |
580 | 581 |
581 | 582 |
582 static MaybeHandle<JSObject> FindIndexedAllCanReadHolder( | 583 static MaybeHandle<JSObject> FindIndexedAllCanReadHolder( |
583 Isolate* isolate, Handle<JSObject> js_object, | 584 Isolate* isolate, Handle<JSObject> js_object, |
584 PrototypeIterator::WhereToStart where_to_start) { | 585 PrototypeIterator::WhereToStart where_to_start) { |
585 for (PrototypeIterator iter(isolate, js_object, where_to_start); | 586 for (PrototypeIterator iter(isolate, js_object, where_to_start); |
586 !iter.IsAtEnd(); iter.Advance()) { | 587 !iter.IsAtEnd(); iter.Advance()) { |
587 auto curr = PrototypeIterator::GetCurrent(iter); | 588 auto curr = PrototypeIterator::GetCurrent(iter); |
588 if (!curr->IsJSObject()) break; | 589 if (!curr->IsJSObject()) break; |
(...skipping 4757 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5346 void JSObject::DeleteNormalizedProperty(Handle<JSObject> object, | 5347 void JSObject::DeleteNormalizedProperty(Handle<JSObject> object, |
5347 Handle<Name> name) { | 5348 Handle<Name> name) { |
5348 DCHECK(!object->HasFastProperties()); | 5349 DCHECK(!object->HasFastProperties()); |
5349 Isolate* isolate = object->GetIsolate(); | 5350 Isolate* isolate = object->GetIsolate(); |
5350 Handle<NameDictionary> dictionary(object->property_dictionary()); | 5351 Handle<NameDictionary> dictionary(object->property_dictionary()); |
5351 int entry = dictionary->FindEntry(name); | 5352 int entry = dictionary->FindEntry(name); |
5352 DCHECK_NE(NameDictionary::kNotFound, entry); | 5353 DCHECK_NE(NameDictionary::kNotFound, entry); |
5353 | 5354 |
5354 // If we have a global object set the cell to the hole. | 5355 // If we have a global object set the cell to the hole. |
5355 if (object->IsGlobalObject()) { | 5356 if (object->IsGlobalObject()) { |
5356 PropertyDetails details = dictionary->DetailsAt(entry); | 5357 DCHECK(dictionary->DetailsAt(entry).IsConfigurable()); |
5357 DCHECK(details.IsConfigurable()); | |
5358 Handle<PropertyCell> cell(PropertyCell::cast(dictionary->ValueAt(entry))); | 5358 Handle<PropertyCell> cell(PropertyCell::cast(dictionary->ValueAt(entry))); |
5359 Handle<Object> value = isolate->factory()->the_hole_value(); | 5359 Handle<Object> value = isolate->factory()->the_hole_value(); |
5360 PropertyCell::SetValueInferType(cell, value); | 5360 PropertyCell::SetValueInferType(cell, value); |
5361 dictionary->DetailsAtPut(entry, details.AsDeleted()); | |
5362 return; | 5361 return; |
5363 } | 5362 } |
5364 | 5363 |
5365 NameDictionary::DeleteProperty(dictionary, entry); | 5364 NameDictionary::DeleteProperty(dictionary, entry); |
5366 Handle<NameDictionary> new_properties = | 5365 Handle<NameDictionary> new_properties = |
5367 NameDictionary::Shrink(dictionary, name); | 5366 NameDictionary::Shrink(dictionary, name); |
5368 object->set_properties(*new_properties); | 5367 object->set_properties(*new_properties); |
5369 } | 5368 } |
5370 | 5369 |
5371 | 5370 |
(...skipping 916 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6288 desc->SetEnumCache(*bridge_storage, | 6287 desc->SetEnumCache(*bridge_storage, |
6289 *storage, | 6288 *storage, |
6290 indices.is_null() ? Object::cast(Smi::FromInt(0)) | 6289 indices.is_null() ? Object::cast(Smi::FromInt(0)) |
6291 : Object::cast(*indices)); | 6290 : Object::cast(*indices)); |
6292 if (cache_result) { | 6291 if (cache_result) { |
6293 object->map()->SetEnumLength(own_property_count); | 6292 object->map()->SetEnumLength(own_property_count); |
6294 } | 6293 } |
6295 return storage; | 6294 return storage; |
6296 } else { | 6295 } else { |
6297 Handle<NameDictionary> dictionary(object->property_dictionary()); | 6296 Handle<NameDictionary> dictionary(object->property_dictionary()); |
6298 int length = dictionary->NumberOfEnumElements(); | 6297 int length = dictionary->NumberOfEnumElements(*object); |
6299 if (length == 0) { | 6298 if (length == 0) { |
6300 return Handle<FixedArray>(isolate->heap()->empty_fixed_array()); | 6299 return Handle<FixedArray>(isolate->heap()->empty_fixed_array()); |
6301 } | 6300 } |
6302 Handle<FixedArray> storage = isolate->factory()->NewFixedArray(length); | 6301 Handle<FixedArray> storage = isolate->factory()->NewFixedArray(length); |
6303 dictionary->CopyEnumKeysTo(*storage); | 6302 dictionary->CopyEnumKeysTo(*object, *storage); |
6304 return storage; | 6303 return storage; |
6305 } | 6304 } |
6306 } | 6305 } |
6307 | 6306 |
6308 | 6307 |
6309 MaybeHandle<FixedArray> JSReceiver::GetKeys(Handle<JSReceiver> object, | 6308 MaybeHandle<FixedArray> JSReceiver::GetKeys(Handle<JSReceiver> object, |
6310 KeyCollectionType type) { | 6309 KeyCollectionType type) { |
6311 USE(ContainsOnlyValidKeys); | 6310 USE(ContainsOnlyValidKeys); |
6312 Isolate* isolate = object->GetIsolate(); | 6311 Isolate* isolate = object->GetIsolate(); |
6313 Handle<FixedArray> content = isolate->factory()->empty_fixed_array(); | 6312 Handle<FixedArray> content = isolate->factory()->empty_fixed_array(); |
(...skipping 7625 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13939 int JSObject::NumberOfOwnProperties(PropertyAttributes filter) { | 13938 int JSObject::NumberOfOwnProperties(PropertyAttributes filter) { |
13940 if (HasFastProperties()) { | 13939 if (HasFastProperties()) { |
13941 Map* map = this->map(); | 13940 Map* map = this->map(); |
13942 if (filter == NONE) return map->NumberOfOwnDescriptors(); | 13941 if (filter == NONE) return map->NumberOfOwnDescriptors(); |
13943 if (filter & DONT_ENUM) { | 13942 if (filter & DONT_ENUM) { |
13944 int result = map->EnumLength(); | 13943 int result = map->EnumLength(); |
13945 if (result != kInvalidEnumCacheSentinel) return result; | 13944 if (result != kInvalidEnumCacheSentinel) return result; |
13946 } | 13945 } |
13947 return map->NumberOfDescribedProperties(OWN_DESCRIPTORS, filter); | 13946 return map->NumberOfDescribedProperties(OWN_DESCRIPTORS, filter); |
13948 } | 13947 } |
13949 return property_dictionary()->NumberOfElementsFilterAttributes(filter); | 13948 return property_dictionary()->NumberOfElementsFilterAttributes(this, filter); |
13950 } | 13949 } |
13951 | 13950 |
13952 | 13951 |
13953 void FixedArray::SwapPairs(FixedArray* numbers, int i, int j) { | 13952 void FixedArray::SwapPairs(FixedArray* numbers, int i, int j) { |
13954 Object* temp = get(i); | 13953 Object* temp = get(i); |
13955 set(i, get(j)); | 13954 set(i, get(j)); |
13956 set(j, temp); | 13955 set(j, temp); |
13957 if (this != numbers) { | 13956 if (this != numbers) { |
13958 temp = numbers->get(i); | 13957 temp = numbers->get(i); |
13959 numbers->set(i, Smi::cast(numbers->get(j))); | 13958 numbers->set(i, Smi::cast(numbers->get(j))); |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14072 if (HasFastProperties()) { | 14071 if (HasFastProperties()) { |
14073 int real_size = map()->NumberOfOwnDescriptors(); | 14072 int real_size = map()->NumberOfOwnDescriptors(); |
14074 DescriptorArray* descs = map()->instance_descriptors(); | 14073 DescriptorArray* descs = map()->instance_descriptors(); |
14075 for (int i = 0; i < real_size; i++) { | 14074 for (int i = 0; i < real_size; i++) { |
14076 if ((descs->GetDetails(i).attributes() & filter) == 0 && | 14075 if ((descs->GetDetails(i).attributes() & filter) == 0 && |
14077 !FilterKey(descs->GetKey(i), filter)) { | 14076 !FilterKey(descs->GetKey(i), filter)) { |
14078 storage->set(index++, descs->GetKey(i)); | 14077 storage->set(index++, descs->GetKey(i)); |
14079 } | 14078 } |
14080 } | 14079 } |
14081 } else { | 14080 } else { |
14082 property_dictionary()->CopyKeysTo(storage, | 14081 property_dictionary()->CopyKeysTo(this, storage, index, filter, |
14083 index, | |
14084 filter, | |
14085 NameDictionary::UNSORTED); | 14082 NameDictionary::UNSORTED); |
14086 } | 14083 } |
14087 } | 14084 } |
14088 | 14085 |
14089 | 14086 |
14090 int JSObject::NumberOfOwnElements(PropertyAttributes filter) { | 14087 int JSObject::NumberOfOwnElements(PropertyAttributes filter) { |
14091 return GetOwnElementKeys(NULL, filter); | 14088 return GetOwnElementKeys(NULL, filter); |
14092 } | 14089 } |
14093 | 14090 |
14094 | 14091 |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14158 storage->set(counter, Smi::FromInt(counter)); | 14155 storage->set(counter, Smi::FromInt(counter)); |
14159 } | 14156 } |
14160 counter++; | 14157 counter++; |
14161 } | 14158 } |
14162 DCHECK(!storage || storage->length() >= counter); | 14159 DCHECK(!storage || storage->length() >= counter); |
14163 break; | 14160 break; |
14164 } | 14161 } |
14165 | 14162 |
14166 case DICTIONARY_ELEMENTS: { | 14163 case DICTIONARY_ELEMENTS: { |
14167 if (storage != NULL) { | 14164 if (storage != NULL) { |
14168 element_dictionary()->CopyKeysTo(storage, | 14165 element_dictionary()->CopyKeysTo<DictionaryEntryType::kObjects>( |
14169 filter, | 14166 storage, filter, SeededNumberDictionary::SORTED); |
14170 SeededNumberDictionary::SORTED); | |
14171 } | 14167 } |
14172 counter += element_dictionary()->NumberOfElementsFilterAttributes(filter); | 14168 counter += |
| 14169 element_dictionary() |
| 14170 ->NumberOfElementsFilterAttributes<DictionaryEntryType::kObjects>( |
| 14171 filter); |
14173 break; | 14172 break; |
14174 } | 14173 } |
14175 case SLOPPY_ARGUMENTS_ELEMENTS: { | 14174 case SLOPPY_ARGUMENTS_ELEMENTS: { |
14176 FixedArray* parameter_map = FixedArray::cast(elements()); | 14175 FixedArray* parameter_map = FixedArray::cast(elements()); |
14177 int mapped_length = parameter_map->length() - 2; | 14176 int mapped_length = parameter_map->length() - 2; |
14178 FixedArray* arguments = FixedArray::cast(parameter_map->get(1)); | 14177 FixedArray* arguments = FixedArray::cast(parameter_map->get(1)); |
14179 if (arguments->IsDictionary()) { | 14178 if (arguments->IsDictionary()) { |
14180 // Copy the keys from arguments first, because Dictionary::CopyKeysTo | 14179 // Copy the keys from arguments first, because Dictionary::CopyKeysTo |
14181 // will insert in storage starting at index 0. | 14180 // will insert in storage starting at index 0. |
14182 SeededNumberDictionary* dictionary = | 14181 SeededNumberDictionary* dictionary = |
14183 SeededNumberDictionary::cast(arguments); | 14182 SeededNumberDictionary::cast(arguments); |
14184 if (storage != NULL) { | 14183 if (storage != NULL) { |
14185 dictionary->CopyKeysTo( | 14184 dictionary->CopyKeysTo<DictionaryEntryType::kObjects>( |
14186 storage, filter, SeededNumberDictionary::UNSORTED); | 14185 storage, filter, SeededNumberDictionary::UNSORTED); |
14187 } | 14186 } |
14188 counter += dictionary->NumberOfElementsFilterAttributes(filter); | 14187 counter += dictionary->NumberOfElementsFilterAttributes< |
| 14188 DictionaryEntryType::kObjects>(filter); |
14189 for (int i = 0; i < mapped_length; ++i) { | 14189 for (int i = 0; i < mapped_length; ++i) { |
14190 if (!parameter_map->get(i + 2)->IsTheHole()) { | 14190 if (!parameter_map->get(i + 2)->IsTheHole()) { |
14191 if (storage != NULL) storage->set(counter, Smi::FromInt(i)); | 14191 if (storage != NULL) storage->set(counter, Smi::FromInt(i)); |
14192 ++counter; | 14192 ++counter; |
14193 } | 14193 } |
14194 } | 14194 } |
14195 if (storage != NULL) storage->SortPairs(storage, counter); | 14195 if (storage != NULL) storage->SortPairs(storage, counter); |
14196 | 14196 |
14197 } else { | 14197 } else { |
14198 int backing_length = arguments->length(); | 14198 int backing_length = arguments->length(); |
(...skipping 570 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14769 AtPut(Handle<UnseededNumberDictionary>, uint32_t, Handle<Object>); | 14769 AtPut(Handle<UnseededNumberDictionary>, uint32_t, Handle<Object>); |
14770 | 14770 |
14771 template Object* | 14771 template Object* |
14772 Dictionary<SeededNumberDictionary, SeededNumberDictionaryShape, uint32_t>:: | 14772 Dictionary<SeededNumberDictionary, SeededNumberDictionaryShape, uint32_t>:: |
14773 SlowReverseLookup(Object* value); | 14773 SlowReverseLookup(Object* value); |
14774 | 14774 |
14775 template Object* | 14775 template Object* |
14776 Dictionary<NameDictionary, NameDictionaryShape, Handle<Name> >:: | 14776 Dictionary<NameDictionary, NameDictionaryShape, Handle<Name> >:: |
14777 SlowReverseLookup(Object* value); | 14777 SlowReverseLookup(Object* value); |
14778 | 14778 |
14779 template void | |
14780 Dictionary<SeededNumberDictionary, SeededNumberDictionaryShape, uint32_t>:: | |
14781 CopyKeysTo( | |
14782 FixedArray*, | |
14783 PropertyAttributes, | |
14784 Dictionary<SeededNumberDictionary, | |
14785 SeededNumberDictionaryShape, | |
14786 uint32_t>::SortMode); | |
14787 | |
14788 template Handle<Object> | 14779 template Handle<Object> |
14789 Dictionary<NameDictionary, NameDictionaryShape, Handle<Name> >::DeleteProperty( | 14780 Dictionary<NameDictionary, NameDictionaryShape, Handle<Name> >::DeleteProperty( |
14790 Handle<NameDictionary>, int); | 14781 Handle<NameDictionary>, int); |
14791 | 14782 |
14792 template Handle<Object> | 14783 template Handle<Object> |
14793 Dictionary<SeededNumberDictionary, SeededNumberDictionaryShape, | 14784 Dictionary<SeededNumberDictionary, SeededNumberDictionaryShape, |
14794 uint32_t>::DeleteProperty(Handle<SeededNumberDictionary>, int); | 14785 uint32_t>::DeleteProperty(Handle<SeededNumberDictionary>, int); |
14795 | 14786 |
14796 template Handle<NameDictionary> | 14787 template Handle<NameDictionary> |
14797 HashTable<NameDictionary, NameDictionaryShape, Handle<Name> >:: | 14788 HashTable<NameDictionary, NameDictionaryShape, Handle<Name> >:: |
14798 New(Isolate*, int, MinimumCapacity, PretenureFlag); | 14789 New(Isolate*, int, MinimumCapacity, PretenureFlag); |
14799 | 14790 |
14800 template Handle<NameDictionary> | 14791 template Handle<NameDictionary> |
14801 HashTable<NameDictionary, NameDictionaryShape, Handle<Name> >:: | 14792 HashTable<NameDictionary, NameDictionaryShape, Handle<Name> >:: |
14802 Shrink(Handle<NameDictionary>, Handle<Name>); | 14793 Shrink(Handle<NameDictionary>, Handle<Name>); |
14803 | 14794 |
14804 template Handle<SeededNumberDictionary> | 14795 template Handle<SeededNumberDictionary> |
14805 HashTable<SeededNumberDictionary, SeededNumberDictionaryShape, uint32_t>:: | 14796 HashTable<SeededNumberDictionary, SeededNumberDictionaryShape, uint32_t>:: |
14806 Shrink(Handle<SeededNumberDictionary>, uint32_t); | 14797 Shrink(Handle<SeededNumberDictionary>, uint32_t); |
14807 | 14798 |
14808 template void Dictionary<NameDictionary, NameDictionaryShape, Handle<Name> >:: | |
14809 CopyKeysTo( | |
14810 FixedArray*, | |
14811 int, | |
14812 PropertyAttributes, | |
14813 Dictionary< | |
14814 NameDictionary, NameDictionaryShape, Handle<Name> >::SortMode); | |
14815 | |
14816 template int | |
14817 Dictionary<NameDictionary, NameDictionaryShape, Handle<Name> >:: | |
14818 NumberOfElementsFilterAttributes(PropertyAttributes); | |
14819 | |
14820 template Handle<NameDictionary> | 14799 template Handle<NameDictionary> |
14821 Dictionary<NameDictionary, NameDictionaryShape, Handle<Name> >::Add( | 14800 Dictionary<NameDictionary, NameDictionaryShape, Handle<Name> >::Add( |
14822 Handle<NameDictionary>, Handle<Name>, Handle<Object>, PropertyDetails); | 14801 Handle<NameDictionary>, Handle<Name>, Handle<Object>, PropertyDetails); |
14823 | 14802 |
14824 template Handle<FixedArray> Dictionary< | 14803 template Handle<FixedArray> Dictionary< |
14825 NameDictionary, NameDictionaryShape, | 14804 NameDictionary, NameDictionaryShape, |
14826 Handle<Name> >::BuildIterationIndicesArray(Handle<NameDictionary>); | 14805 Handle<Name> >::BuildIterationIndicesArray(Handle<NameDictionary>); |
14827 | 14806 |
14828 template Handle<FixedArray> Dictionary< | 14807 template Handle<FixedArray> Dictionary< |
14829 NameDictionary, NameDictionaryShape, | 14808 NameDictionary, NameDictionaryShape, |
14830 Handle<Name> >::GenerateNewEnumerationIndices(Handle<NameDictionary>); | 14809 Handle<Name> >::GenerateNewEnumerationIndices(Handle<NameDictionary>); |
14831 | 14810 |
14832 template int | |
14833 Dictionary<SeededNumberDictionary, SeededNumberDictionaryShape, uint32_t>:: | |
14834 NumberOfElementsFilterAttributes(PropertyAttributes); | |
14835 | |
14836 template Handle<SeededNumberDictionary> | 14811 template Handle<SeededNumberDictionary> |
14837 Dictionary<SeededNumberDictionary, SeededNumberDictionaryShape, uint32_t>:: | 14812 Dictionary<SeededNumberDictionary, SeededNumberDictionaryShape, uint32_t>:: |
14838 Add(Handle<SeededNumberDictionary>, | 14813 Add(Handle<SeededNumberDictionary>, |
14839 uint32_t, | 14814 uint32_t, |
14840 Handle<Object>, | 14815 Handle<Object>, |
14841 PropertyDetails); | 14816 PropertyDetails); |
14842 | 14817 |
14843 template Handle<UnseededNumberDictionary> | 14818 template Handle<UnseededNumberDictionary> |
14844 Dictionary<UnseededNumberDictionary, UnseededNumberDictionaryShape, uint32_t>:: | 14819 Dictionary<UnseededNumberDictionary, UnseededNumberDictionaryShape, uint32_t>:: |
14845 Add(Handle<UnseededNumberDictionary>, | 14820 Add(Handle<UnseededNumberDictionary>, |
14846 uint32_t, | 14821 uint32_t, |
14847 Handle<Object>, | 14822 Handle<Object>, |
14848 PropertyDetails); | 14823 PropertyDetails); |
14849 | 14824 |
14850 template Handle<SeededNumberDictionary> | 14825 template Handle<SeededNumberDictionary> |
14851 Dictionary<SeededNumberDictionary, SeededNumberDictionaryShape, uint32_t>:: | 14826 Dictionary<SeededNumberDictionary, SeededNumberDictionaryShape, uint32_t>:: |
14852 EnsureCapacity(Handle<SeededNumberDictionary>, int, uint32_t); | 14827 EnsureCapacity(Handle<SeededNumberDictionary>, int, uint32_t); |
14853 | 14828 |
14854 template Handle<UnseededNumberDictionary> | 14829 template Handle<UnseededNumberDictionary> |
14855 Dictionary<UnseededNumberDictionary, UnseededNumberDictionaryShape, uint32_t>:: | 14830 Dictionary<UnseededNumberDictionary, UnseededNumberDictionaryShape, uint32_t>:: |
14856 EnsureCapacity(Handle<UnseededNumberDictionary>, int, uint32_t); | 14831 EnsureCapacity(Handle<UnseededNumberDictionary>, int, uint32_t); |
14857 | 14832 |
14858 template Handle<NameDictionary> | 14833 template Handle<NameDictionary> |
14859 Dictionary<NameDictionary, NameDictionaryShape, Handle<Name> >:: | 14834 Dictionary<NameDictionary, NameDictionaryShape, Handle<Name> >:: |
14860 EnsureCapacity(Handle<NameDictionary>, int, Handle<Name>); | 14835 EnsureCapacity(Handle<NameDictionary>, int, Handle<Name>); |
14861 | 14836 |
14862 template | 14837 template bool |
14863 int Dictionary<SeededNumberDictionary, SeededNumberDictionaryShape, uint32_t>:: | 14838 Dictionary<SeededNumberDictionary, SeededNumberDictionaryShape, |
14864 NumberOfEnumElements(); | 14839 uint32_t>::HasComplexElements<DictionaryEntryType::kCells>(); |
14865 | 14840 |
14866 template | 14841 template bool |
14867 int Dictionary<NameDictionary, NameDictionaryShape, Handle<Name> >:: | 14842 Dictionary<SeededNumberDictionary, SeededNumberDictionaryShape, |
14868 NumberOfEnumElements(); | 14843 uint32_t>::HasComplexElements<DictionaryEntryType::kObjects>(); |
14869 | |
14870 template bool Dictionary<SeededNumberDictionary, SeededNumberDictionaryShape, | |
14871 uint32_t>::HasComplexElements(); | |
14872 | 14844 |
14873 template int HashTable<SeededNumberDictionary, SeededNumberDictionaryShape, | 14845 template int HashTable<SeededNumberDictionary, SeededNumberDictionaryShape, |
14874 uint32_t>::FindEntry(uint32_t); | 14846 uint32_t>::FindEntry(uint32_t); |
14875 | 14847 |
14876 | 14848 |
14877 Handle<Object> JSObject::PrepareSlowElementsForSort( | 14849 Handle<Object> JSObject::PrepareSlowElementsForSort( |
14878 Handle<JSObject> object, uint32_t limit) { | 14850 Handle<JSObject> object, uint32_t limit) { |
14879 DCHECK(object->HasDictionaryElements()); | 14851 DCHECK(object->HasDictionaryElements()); |
14880 Isolate* isolate = object->GetIsolate(); | 14852 Isolate* isolate = object->GetIsolate(); |
14881 // Must stay in dictionary mode, either because of requires_slow_elements, | 14853 // Must stay in dictionary mode, either because of requires_slow_elements, |
(...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15323 | 15295 |
15324 | 15296 |
15325 Handle<PropertyCell> GlobalObject::EnsurePropertyCell( | 15297 Handle<PropertyCell> GlobalObject::EnsurePropertyCell( |
15326 Handle<GlobalObject> global, Handle<Name> name) { | 15298 Handle<GlobalObject> global, Handle<Name> name) { |
15327 DCHECK(!global->HasFastProperties()); | 15299 DCHECK(!global->HasFastProperties()); |
15328 int entry = global->property_dictionary()->FindEntry(name); | 15300 int entry = global->property_dictionary()->FindEntry(name); |
15329 if (entry == NameDictionary::kNotFound) { | 15301 if (entry == NameDictionary::kNotFound) { |
15330 Isolate* isolate = global->GetIsolate(); | 15302 Isolate* isolate = global->GetIsolate(); |
15331 Handle<PropertyCell> cell = isolate->factory()->NewPropertyCellWithHole(); | 15303 Handle<PropertyCell> cell = isolate->factory()->NewPropertyCellWithHole(); |
15332 PropertyDetails details(NONE, DATA, 0); | 15304 PropertyDetails details(NONE, DATA, 0); |
15333 details = details.AsDeleted(); | |
15334 Handle<NameDictionary> dictionary = NameDictionary::Add( | 15305 Handle<NameDictionary> dictionary = NameDictionary::Add( |
15335 handle(global->property_dictionary()), name, cell, details); | 15306 handle(global->property_dictionary()), name, cell, details); |
15336 global->set_properties(*dictionary); | 15307 global->set_properties(*dictionary); |
15337 return cell; | 15308 return cell; |
15338 } else { | 15309 } else { |
15339 Object* value = global->property_dictionary()->ValueAt(entry); | 15310 Object* value = global->property_dictionary()->ValueAt(entry); |
15340 DCHECK(value->IsPropertyCell()); | 15311 DCHECK(value->IsPropertyCell()); |
15341 return handle(PropertyCell::cast(value)); | 15312 return handle(PropertyCell::cast(value)); |
15342 } | 15313 } |
15343 } | 15314 } |
(...skipping 488 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15832 Handle<Derived> dictionary, | 15803 Handle<Derived> dictionary, |
15833 Key key, | 15804 Key key, |
15834 Handle<Object> value, | 15805 Handle<Object> value, |
15835 PropertyDetails details, | 15806 PropertyDetails details, |
15836 uint32_t hash) { | 15807 uint32_t hash) { |
15837 // Compute the key object. | 15808 // Compute the key object. |
15838 Handle<Object> k = Shape::AsHandle(dictionary->GetIsolate(), key); | 15809 Handle<Object> k = Shape::AsHandle(dictionary->GetIsolate(), key); |
15839 | 15810 |
15840 uint32_t entry = dictionary->FindInsertionEntry(hash); | 15811 uint32_t entry = dictionary->FindInsertionEntry(hash); |
15841 // Insert element at empty or deleted entry | 15812 // Insert element at empty or deleted entry |
15842 if (!details.IsDeleted() && | 15813 if (details.dictionary_index() == 0 && Shape::kIsEnumerable) { |
15843 details.dictionary_index() == 0 && | |
15844 Shape::kIsEnumerable) { | |
15845 // Assign an enumeration index to the property and update | 15814 // Assign an enumeration index to the property and update |
15846 // SetNextEnumerationIndex. | 15815 // SetNextEnumerationIndex. |
15847 int index = dictionary->NextEnumerationIndex(); | 15816 int index = dictionary->NextEnumerationIndex(); |
15848 details = PropertyDetails(details.attributes(), details.type(), index); | 15817 details = PropertyDetails(details.attributes(), details.type(), index); |
15849 dictionary->SetNextEnumerationIndex(index + 1); | 15818 dictionary->SetNextEnumerationIndex(index + 1); |
15850 } | 15819 } |
15851 dictionary->SetEntry(entry, k, value, details); | 15820 dictionary->SetEntry(entry, k, value, details); |
15852 DCHECK((dictionary->KeyAt(entry)->IsNumber() || | 15821 DCHECK((dictionary->KeyAt(entry)->IsNumber() || |
15853 dictionary->KeyAt(entry)->IsName())); | 15822 dictionary->KeyAt(entry)->IsName())); |
15854 dictionary->ElementAdded(); | 15823 dictionary->ElementAdded(); |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15938 Handle<Object> value) { | 15907 Handle<Object> value) { |
15939 int entry = dictionary->FindEntry(key); | 15908 int entry = dictionary->FindEntry(key); |
15940 if (entry == kNotFound) return AddNumberEntry(dictionary, key, value); | 15909 if (entry == kNotFound) return AddNumberEntry(dictionary, key, value); |
15941 Handle<Object> object_key = | 15910 Handle<Object> object_key = |
15942 UnseededNumberDictionaryShape::AsHandle(dictionary->GetIsolate(), key); | 15911 UnseededNumberDictionaryShape::AsHandle(dictionary->GetIsolate(), key); |
15943 dictionary->SetEntry(entry, object_key, value); | 15912 dictionary->SetEntry(entry, object_key, value); |
15944 return dictionary; | 15913 return dictionary; |
15945 } | 15914 } |
15946 | 15915 |
15947 | 15916 |
| 15917 template <DictionaryEntryType type, typename D> |
| 15918 static inline bool IsDeleted(D d, int i) { |
| 15919 switch (type) { |
| 15920 case DictionaryEntryType::kObjects: |
| 15921 return false; |
| 15922 case DictionaryEntryType::kCells: |
| 15923 return PropertyCell::cast(d->ValueAt(i))->value()->IsTheHole(); |
| 15924 } |
| 15925 UNREACHABLE(); |
| 15926 return false; |
| 15927 } |
15948 | 15928 |
15949 template<typename Derived, typename Shape, typename Key> | 15929 |
| 15930 template <typename Derived, typename Shape, typename Key> |
| 15931 template <DictionaryEntryType type> |
15950 int Dictionary<Derived, Shape, Key>::NumberOfElementsFilterAttributes( | 15932 int Dictionary<Derived, Shape, Key>::NumberOfElementsFilterAttributes( |
15951 PropertyAttributes filter) { | 15933 PropertyAttributes filter) { |
15952 int capacity = DerivedHashTable::Capacity(); | 15934 int capacity = DerivedHashTable::Capacity(); |
15953 int result = 0; | 15935 int result = 0; |
15954 for (int i = 0; i < capacity; i++) { | 15936 for (int i = 0; i < capacity; i++) { |
15955 Object* k = DerivedHashTable::KeyAt(i); | 15937 Object* k = DerivedHashTable::KeyAt(i); |
15956 if (DerivedHashTable::IsKey(k) && !FilterKey(k, filter)) { | 15938 if (DerivedHashTable::IsKey(k) && !FilterKey(k, filter)) { |
| 15939 if (IsDeleted<type>(this, i)) continue; |
15957 PropertyDetails details = DetailsAt(i); | 15940 PropertyDetails details = DetailsAt(i); |
15958 if (details.IsDeleted()) continue; | |
15959 PropertyAttributes attr = details.attributes(); | 15941 PropertyAttributes attr = details.attributes(); |
15960 if ((attr & filter) == 0) result++; | 15942 if ((attr & filter) == 0) result++; |
15961 } | 15943 } |
15962 } | 15944 } |
15963 return result; | 15945 return result; |
15964 } | 15946 } |
15965 | 15947 |
15966 | 15948 |
15967 template<typename Derived, typename Shape, typename Key> | |
15968 int Dictionary<Derived, Shape, Key>::NumberOfEnumElements() { | |
15969 return NumberOfElementsFilterAttributes( | |
15970 static_cast<PropertyAttributes>(DONT_ENUM | SYMBOLIC)); | |
15971 } | |
15972 | |
15973 | |
15974 template <typename Derived, typename Shape, typename Key> | 15949 template <typename Derived, typename Shape, typename Key> |
| 15950 template <DictionaryEntryType type> |
15975 bool Dictionary<Derived, Shape, Key>::HasComplexElements() { | 15951 bool Dictionary<Derived, Shape, Key>::HasComplexElements() { |
15976 int capacity = DerivedHashTable::Capacity(); | 15952 int capacity = DerivedHashTable::Capacity(); |
15977 for (int i = 0; i < capacity; i++) { | 15953 for (int i = 0; i < capacity; i++) { |
15978 Object* k = DerivedHashTable::KeyAt(i); | 15954 Object* k = DerivedHashTable::KeyAt(i); |
15979 if (DerivedHashTable::IsKey(k) && !FilterKey(k, NONE)) { | 15955 if (DerivedHashTable::IsKey(k) && !FilterKey(k, NONE)) { |
| 15956 if (IsDeleted<type>(this, i)) continue; |
15980 PropertyDetails details = DetailsAt(i); | 15957 PropertyDetails details = DetailsAt(i); |
15981 if (details.IsDeleted()) continue; | |
15982 if (details.type() == ACCESSOR_CONSTANT) return true; | 15958 if (details.type() == ACCESSOR_CONSTANT) return true; |
15983 PropertyAttributes attr = details.attributes(); | 15959 PropertyAttributes attr = details.attributes(); |
15984 if (attr & (READ_ONLY | DONT_DELETE | DONT_ENUM)) return true; | 15960 if (attr & (READ_ONLY | DONT_DELETE | DONT_ENUM)) return true; |
15985 } | 15961 } |
15986 } | 15962 } |
15987 return false; | 15963 return false; |
15988 } | 15964 } |
15989 | 15965 |
15990 | 15966 |
15991 template <typename Derived, typename Shape, typename Key> | 15967 template <typename Derived, typename Shape, typename Key> |
| 15968 template <DictionaryEntryType type> |
15992 void Dictionary<Derived, Shape, Key>::CopyKeysTo( | 15969 void Dictionary<Derived, Shape, Key>::CopyKeysTo( |
15993 FixedArray* storage, PropertyAttributes filter, | 15970 FixedArray* storage, PropertyAttributes filter, |
15994 typename Dictionary<Derived, Shape, Key>::SortMode sort_mode) { | 15971 typename Dictionary<Derived, Shape, Key>::SortMode sort_mode) { |
15995 DCHECK(storage->length() >= NumberOfElementsFilterAttributes(filter)); | 15972 DCHECK(storage->length() >= NumberOfElementsFilterAttributes<type>(filter)); |
15996 int capacity = DerivedHashTable::Capacity(); | 15973 int capacity = DerivedHashTable::Capacity(); |
15997 int index = 0; | 15974 int index = 0; |
15998 for (int i = 0; i < capacity; i++) { | 15975 for (int i = 0; i < capacity; i++) { |
15999 Object* k = DerivedHashTable::KeyAt(i); | 15976 Object* k = DerivedHashTable::KeyAt(i); |
16000 if (DerivedHashTable::IsKey(k) && !FilterKey(k, filter)) { | 15977 if (DerivedHashTable::IsKey(k) && !FilterKey(k, filter)) { |
| 15978 if (IsDeleted<type>(this, i)) continue; |
16001 PropertyDetails details = DetailsAt(i); | 15979 PropertyDetails details = DetailsAt(i); |
16002 if (details.IsDeleted()) continue; | |
16003 PropertyAttributes attr = details.attributes(); | 15980 PropertyAttributes attr = details.attributes(); |
16004 if ((attr & filter) == 0) storage->set(index++, k); | 15981 if ((attr & filter) == 0) storage->set(index++, k); |
16005 } | 15982 } |
16006 } | 15983 } |
16007 if (sort_mode == Dictionary::SORTED) { | 15984 if (sort_mode == Dictionary::SORTED) { |
16008 storage->SortPairs(storage, index); | 15985 storage->SortPairs(storage, index); |
16009 } | 15986 } |
16010 DCHECK(storage->length() >= index); | 15987 DCHECK(storage->length() >= index); |
16011 } | 15988 } |
16012 | 15989 |
16013 | 15990 |
16014 struct EnumIndexComparator { | 15991 struct EnumIndexComparator { |
16015 explicit EnumIndexComparator(NameDictionary* dict) : dict(dict) { } | 15992 explicit EnumIndexComparator(NameDictionary* dict) : dict(dict) { } |
16016 bool operator() (Smi* a, Smi* b) { | 15993 bool operator() (Smi* a, Smi* b) { |
16017 PropertyDetails da(dict->DetailsAt(a->value())); | 15994 PropertyDetails da(dict->DetailsAt(a->value())); |
16018 PropertyDetails db(dict->DetailsAt(b->value())); | 15995 PropertyDetails db(dict->DetailsAt(b->value())); |
16019 return da.dictionary_index() < db.dictionary_index(); | 15996 return da.dictionary_index() < db.dictionary_index(); |
16020 } | 15997 } |
16021 NameDictionary* dict; | 15998 NameDictionary* dict; |
16022 }; | 15999 }; |
16023 | 16000 |
16024 | 16001 |
| 16002 template <DictionaryEntryType type> |
16025 void NameDictionary::CopyEnumKeysTo(FixedArray* storage) { | 16003 void NameDictionary::CopyEnumKeysTo(FixedArray* storage) { |
16026 int length = storage->length(); | 16004 int length = storage->length(); |
16027 int capacity = Capacity(); | 16005 int capacity = Capacity(); |
16028 int properties = 0; | 16006 int properties = 0; |
16029 for (int i = 0; i < capacity; i++) { | 16007 for (int i = 0; i < capacity; i++) { |
16030 Object* k = KeyAt(i); | 16008 Object* k = KeyAt(i); |
16031 if (IsKey(k) && !k->IsSymbol()) { | 16009 if (IsKey(k) && !k->IsSymbol()) { |
16032 PropertyDetails details = DetailsAt(i); | 16010 PropertyDetails details = DetailsAt(i); |
16033 if (details.IsDeleted() || details.IsDontEnum()) continue; | 16011 if (details.IsDontEnum() || IsDeleted<type>(this, i)) continue; |
16034 storage->set(properties, Smi::FromInt(i)); | 16012 storage->set(properties, Smi::FromInt(i)); |
16035 properties++; | 16013 properties++; |
16036 if (properties == length) break; | 16014 if (properties == length) break; |
16037 } | 16015 } |
16038 } | 16016 } |
16039 CHECK_EQ(length, properties); | 16017 CHECK_EQ(length, properties); |
16040 EnumIndexComparator cmp(this); | 16018 EnumIndexComparator cmp(this); |
16041 Smi** start = reinterpret_cast<Smi**>(storage->GetFirstElementAddress()); | 16019 Smi** start = reinterpret_cast<Smi**>(storage->GetFirstElementAddress()); |
16042 std::sort(start, start + length, cmp); | 16020 std::sort(start, start + length, cmp); |
16043 for (int i = 0; i < length; i++) { | 16021 for (int i = 0; i < length; i++) { |
16044 int index = Smi::cast(storage->get(i))->value(); | 16022 int index = Smi::cast(storage->get(i))->value(); |
16045 storage->set(i, KeyAt(index)); | 16023 storage->set(i, KeyAt(index)); |
16046 } | 16024 } |
16047 } | 16025 } |
16048 | 16026 |
16049 | 16027 |
16050 template<typename Derived, typename Shape, typename Key> | 16028 template <typename Derived, typename Shape, typename Key> |
| 16029 template <DictionaryEntryType type> |
16051 void Dictionary<Derived, Shape, Key>::CopyKeysTo( | 16030 void Dictionary<Derived, Shape, Key>::CopyKeysTo( |
16052 FixedArray* storage, | 16031 FixedArray* storage, int index, PropertyAttributes filter, |
16053 int index, | |
16054 PropertyAttributes filter, | |
16055 typename Dictionary<Derived, Shape, Key>::SortMode sort_mode) { | 16032 typename Dictionary<Derived, Shape, Key>::SortMode sort_mode) { |
16056 DCHECK(storage->length() >= NumberOfElementsFilterAttributes(filter)); | 16033 DCHECK(storage->length() >= NumberOfElementsFilterAttributes<type>(filter)); |
16057 int capacity = DerivedHashTable::Capacity(); | 16034 int capacity = DerivedHashTable::Capacity(); |
16058 for (int i = 0; i < capacity; i++) { | 16035 for (int i = 0; i < capacity; i++) { |
16059 Object* k = DerivedHashTable::KeyAt(i); | 16036 Object* k = DerivedHashTable::KeyAt(i); |
16060 if (DerivedHashTable::IsKey(k) && !FilterKey(k, filter)) { | 16037 if (DerivedHashTable::IsKey(k) && !FilterKey(k, filter)) { |
| 16038 if (IsDeleted<type>(this, i)) continue; |
16061 PropertyDetails details = DetailsAt(i); | 16039 PropertyDetails details = DetailsAt(i); |
16062 if (details.IsDeleted()) continue; | |
16063 PropertyAttributes attr = details.attributes(); | 16040 PropertyAttributes attr = details.attributes(); |
16064 if ((attr & filter) == 0) storage->set(index++, k); | 16041 if ((attr & filter) == 0) storage->set(index++, k); |
16065 } | 16042 } |
16066 } | 16043 } |
16067 if (sort_mode == Dictionary::SORTED) { | 16044 if (sort_mode == Dictionary::SORTED) { |
16068 storage->SortPairs(storage, index); | 16045 storage->SortPairs(storage, index); |
16069 } | 16046 } |
16070 DCHECK(storage->length() >= index); | 16047 DCHECK(storage->length() >= index); |
16071 } | 16048 } |
16072 | 16049 |
16073 | 16050 |
16074 // Backwards lookup (slow). | 16051 // Backwards lookup (slow). |
16075 template<typename Derived, typename Shape, typename Key> | 16052 template<typename Derived, typename Shape, typename Key> |
16076 Object* Dictionary<Derived, Shape, Key>::SlowReverseLookup(Object* value) { | 16053 Object* Dictionary<Derived, Shape, Key>::SlowReverseLookup(Object* value) { |
16077 int capacity = DerivedHashTable::Capacity(); | 16054 int capacity = DerivedHashTable::Capacity(); |
16078 for (int i = 0; i < capacity; i++) { | 16055 for (int i = 0; i < capacity; i++) { |
16079 Object* k = DerivedHashTable::KeyAt(i); | 16056 Object* k = DerivedHashTable::KeyAt(i); |
16080 if (Dictionary::IsKey(k)) { | 16057 if (Dictionary::IsKey(k)) { |
16081 Object* e = ValueAt(i); | 16058 Object* e = ValueAt(i); |
| 16059 // TODO(dcarney): this should be templatized. |
16082 if (e->IsPropertyCell()) { | 16060 if (e->IsPropertyCell()) { |
16083 e = PropertyCell::cast(e)->value(); | 16061 e = PropertyCell::cast(e)->value(); |
16084 } | 16062 } |
16085 if (e == value) return k; | 16063 if (e == value) return k; |
16086 } | 16064 } |
16087 } | 16065 } |
16088 Heap* heap = Dictionary::GetHeap(); | 16066 Heap* heap = Dictionary::GetHeap(); |
16089 return heap->undefined_value(); | 16067 return heap->undefined_value(); |
16090 } | 16068 } |
16091 | 16069 |
(...skipping 1059 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
17151 CompilationInfo* info) { | 17129 CompilationInfo* info) { |
17152 Handle<DependentCode> codes = DependentCode::InsertCompilationInfo( | 17130 Handle<DependentCode> codes = DependentCode::InsertCompilationInfo( |
17153 handle(cell->dependent_code(), info->isolate()), | 17131 handle(cell->dependent_code(), info->isolate()), |
17154 DependentCode::kPropertyCellChangedGroup, info->object_wrapper()); | 17132 DependentCode::kPropertyCellChangedGroup, info->object_wrapper()); |
17155 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes); | 17133 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes); |
17156 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add( | 17134 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add( |
17157 cell, info->zone()); | 17135 cell, info->zone()); |
17158 } | 17136 } |
17159 | 17137 |
17160 } } // namespace v8::internal | 17138 } } // namespace v8::internal |
OLD | NEW |