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

Side by Side Diff: src/objects.cc

Issue 9212006: [objects] NotSeededNumberDictionary Base URL: gh:v8/v8@master
Patch Set: Created 8 years, 11 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.h ('k') | src/objects-inl.h » ('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 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 11006 matching lines...) Expand 10 before | Expand all | Expand 10 after
11017 template class HashTable<CompilationCacheShape, HashTableKey*>; 11017 template class HashTable<CompilationCacheShape, HashTableKey*>;
11018 11018
11019 template class HashTable<MapCacheShape, HashTableKey*>; 11019 template class HashTable<MapCacheShape, HashTableKey*>;
11020 11020
11021 template class HashTable<ObjectHashTableShape<1>, Object*>; 11021 template class HashTable<ObjectHashTableShape<1>, Object*>;
11022 11022
11023 template class HashTable<ObjectHashTableShape<2>, Object*>; 11023 template class HashTable<ObjectHashTableShape<2>, Object*>;
11024 11024
11025 template class Dictionary<StringDictionaryShape, String*>; 11025 template class Dictionary<StringDictionaryShape, String*>;
11026 11026
11027 template class Dictionary<NumberDictionaryShape, uint32_t>; 11027 template class Dictionary<NumberDictionaryShape<kSeeded>, uint32_t>;
11028 11028
11029 template MaybeObject* Dictionary<NumberDictionaryShape, uint32_t>::Allocate( 11029 template class Dictionary<NumberDictionaryShape<kNotSeeded>, uint32_t>;
11030 int); 11030
11031 template MaybeObject* Dictionary<NumberDictionaryShape<kSeeded>, uint32_t>::
11032 Allocate(int);
11033
11034 template MaybeObject* Dictionary<NumberDictionaryShape<kNotSeeded>, uint32_t>::
11035 Allocate(int);
11031 11036
11032 template MaybeObject* Dictionary<StringDictionaryShape, String*>::Allocate( 11037 template MaybeObject* Dictionary<StringDictionaryShape, String*>::Allocate(
11033 int); 11038 int);
11034 11039
11035 template MaybeObject* Dictionary<NumberDictionaryShape, uint32_t>::AtPut( 11040 template MaybeObject* Dictionary<NumberDictionaryShape<kSeeded>, uint32_t>::
11036 uint32_t, Object*); 11041 AtPut(uint32_t, Object*);
11037 11042
11038 template Object* Dictionary<NumberDictionaryShape, uint32_t>::SlowReverseLookup( 11043 template MaybeObject* Dictionary<NumberDictionaryShape<kNotSeeded>, uint32_t>::
11039 Object*); 11044 AtPut(uint32_t, Object*);
11045
11046 template Object* Dictionary<NumberDictionaryShape<kSeeded>, uint32_t>::
11047 SlowReverseLookup(Object*);
11048
11049 template Object* Dictionary<NumberDictionaryShape<kNotSeeded>, uint32_t>::
11050 SlowReverseLookup(Object*);
11040 11051
11041 template Object* Dictionary<StringDictionaryShape, String*>::SlowReverseLookup( 11052 template Object* Dictionary<StringDictionaryShape, String*>::SlowReverseLookup(
11042 Object*); 11053 Object*);
11043 11054
11044 template void Dictionary<NumberDictionaryShape, uint32_t>::CopyKeysTo( 11055 template void Dictionary<NumberDictionaryShape<kSeeded>, uint32_t>::
11045 FixedArray*, 11056 CopyKeysTo(FixedArray*,
11046 PropertyAttributes, 11057 PropertyAttributes,
11047 Dictionary<NumberDictionaryShape, uint32_t>::SortMode); 11058 Dictionary<NumberDictionaryShape<kSeeded>, uint32_t>::SortMode);
11059
11060 template void Dictionary<NumberDictionaryShape<kNotSeeded>, uint32_t>::
11061 CopyKeysTo(
11062 FixedArray*,
11063 PropertyAttributes,
11064 Dictionary<NumberDictionaryShape<kNotSeeded>, uint32_t>::SortMode);
11048 11065
11049 template Object* Dictionary<StringDictionaryShape, String*>::DeleteProperty( 11066 template Object* Dictionary<StringDictionaryShape, String*>::DeleteProperty(
11050 int, JSObject::DeleteMode); 11067 int, JSObject::DeleteMode);
11051 11068
11052 template Object* Dictionary<NumberDictionaryShape, uint32_t>::DeleteProperty( 11069 template Object* Dictionary<NumberDictionaryShape<kSeeded>, uint32_t>::
11053 int, JSObject::DeleteMode); 11070 DeleteProperty(int, JSObject::DeleteMode);
11071
11072 template Object* Dictionary<NumberDictionaryShape<kNotSeeded>, uint32_t>::
11073 DeleteProperty(int, JSObject::DeleteMode);
11054 11074
11055 template MaybeObject* Dictionary<StringDictionaryShape, String*>::Shrink( 11075 template MaybeObject* Dictionary<StringDictionaryShape, String*>::Shrink(
11056 String*); 11076 String*);
11057 11077
11058 template MaybeObject* Dictionary<NumberDictionaryShape, uint32_t>::Shrink( 11078 template MaybeObject* Dictionary<NumberDictionaryShape<kSeeded>, uint32_t>::
11059 uint32_t); 11079 Shrink(uint32_t);
11080
11081 template MaybeObject* Dictionary<NumberDictionaryShape<kNotSeeded>, uint32_t>::
11082 Shrink(uint32_t);
11060 11083
11061 template void Dictionary<StringDictionaryShape, String*>::CopyKeysTo( 11084 template void Dictionary<StringDictionaryShape, String*>::CopyKeysTo(
11062 FixedArray*, 11085 FixedArray*,
11063 int, 11086 int,
11064 Dictionary<StringDictionaryShape, String*>::SortMode); 11087 Dictionary<StringDictionaryShape, String*>::SortMode);
11065 11088
11066 template int 11089 template int
11067 Dictionary<StringDictionaryShape, String*>::NumberOfElementsFilterAttributes( 11090 Dictionary<StringDictionaryShape, String*>::NumberOfElementsFilterAttributes(
11068 PropertyAttributes); 11091 PropertyAttributes);
11069 11092
11070 template MaybeObject* Dictionary<StringDictionaryShape, String*>::Add( 11093 template MaybeObject* Dictionary<StringDictionaryShape, String*>::Add(
11071 String*, Object*, PropertyDetails); 11094 String*, Object*, PropertyDetails);
11072 11095
11073 template MaybeObject* 11096 template MaybeObject*
11074 Dictionary<StringDictionaryShape, String*>::GenerateNewEnumerationIndices(); 11097 Dictionary<StringDictionaryShape, String*>::GenerateNewEnumerationIndices();
11075 11098
11076 template int 11099 template int
11077 Dictionary<NumberDictionaryShape, uint32_t>::NumberOfElementsFilterAttributes( 11100 Dictionary<NumberDictionaryShape<kSeeded>, uint32_t>::
11078 PropertyAttributes); 11101 NumberOfElementsFilterAttributes(PropertyAttributes);
11079 11102
11080 template MaybeObject* Dictionary<NumberDictionaryShape, uint32_t>::Add( 11103 template int
11104 Dictionary<NumberDictionaryShape<kNotSeeded>, uint32_t>::
11105 NumberOfElementsFilterAttributes(PropertyAttributes);
11106
11107 template MaybeObject* Dictionary<NumberDictionaryShape<kSeeded>, uint32_t>::Add(
11081 uint32_t, Object*, PropertyDetails); 11108 uint32_t, Object*, PropertyDetails);
11082 11109
11083 template MaybeObject* Dictionary<NumberDictionaryShape, uint32_t>:: 11110 template MaybeObject* Dictionary<NumberDictionaryShape<kNotSeeded>, uint32_t>::
11111 Add(uint32_t, Object*, PropertyDetails);
11112
11113 template MaybeObject* Dictionary<NumberDictionaryShape<kSeeded>, uint32_t>::
11114 EnsureCapacity(int, uint32_t);
11115
11116 template MaybeObject* Dictionary<NumberDictionaryShape<kNotSeeded>, uint32_t>::
11084 EnsureCapacity(int, uint32_t); 11117 EnsureCapacity(int, uint32_t);
11085 11118
11086 template MaybeObject* Dictionary<StringDictionaryShape, String*>:: 11119 template MaybeObject* Dictionary<StringDictionaryShape, String*>::
11087 EnsureCapacity(int, String*); 11120 EnsureCapacity(int, String*);
11088 11121
11089 template MaybeObject* Dictionary<NumberDictionaryShape, uint32_t>::AddEntry( 11122 template MaybeObject* Dictionary<NumberDictionaryShape<kSeeded>, uint32_t>::
11090 uint32_t, Object*, PropertyDetails, uint32_t); 11123 AddEntry(uint32_t, Object*, PropertyDetails, uint32_t);
11124
11125 template MaybeObject* Dictionary<NumberDictionaryShape<kNotSeeded>, uint32_t>::
11126 AddEntry(uint32_t, Object*, PropertyDetails, uint32_t);
11091 11127
11092 template MaybeObject* Dictionary<StringDictionaryShape, String*>::AddEntry( 11128 template MaybeObject* Dictionary<StringDictionaryShape, String*>::AddEntry(
11093 String*, Object*, PropertyDetails, uint32_t); 11129 String*, Object*, PropertyDetails, uint32_t);
11094 11130
11095 template 11131 template
11096 int Dictionary<NumberDictionaryShape, uint32_t>::NumberOfEnumElements(); 11132 int Dictionary<NumberDictionaryShape<kSeeded>, uint32_t>::
11133 NumberOfEnumElements();
11134
11135 template
11136 int Dictionary<NumberDictionaryShape<kNotSeeded>, uint32_t>::
11137 NumberOfEnumElements();
11097 11138
11098 template 11139 template
11099 int Dictionary<StringDictionaryShape, String*>::NumberOfEnumElements(); 11140 int Dictionary<StringDictionaryShape, String*>::NumberOfEnumElements();
11100 11141
11101 template 11142 template
11102 int HashTable<NumberDictionaryShape, uint32_t>::FindEntry(uint32_t); 11143 int HashTable<NumberDictionaryShape<kSeeded>, uint32_t>::FindEntry(uint32_t);
11144
11145 template
11146 int HashTable<NumberDictionaryShape<kNotSeeded>, uint32_t>::FindEntry(uint32_t);
11103 11147
11104 11148
11105 // Collates undefined and unexisting elements below limit from position 11149 // Collates undefined and unexisting elements below limit from position
11106 // zero of the elements. The object stays in Dictionary mode. 11150 // zero of the elements. The object stays in Dictionary mode.
11107 MaybeObject* JSObject::PrepareSlowElementsForSort(uint32_t limit) { 11151 MaybeObject* JSObject::PrepareSlowElementsForSort(uint32_t limit) {
11108 ASSERT(HasDictionaryElements()); 11152 ASSERT(HasDictionaryElements());
11109 // Must stay in dictionary mode, either because of requires_slow_elements, 11153 // Must stay in dictionary mode, either because of requires_slow_elements,
11110 // or because we are not going to sort (and therefore compact) all of the 11154 // or because we are not going to sort (and therefore compact) all of the
11111 // elements. 11155 // elements.
11112 NumberDictionary* dict = element_dictionary(); 11156 NumberDictionary* dict = element_dictionary();
(...skipping 944 matching lines...) Expand 10 before | Expand all | Expand 10 after
12057 SetNextEnumerationIndex(index + 1); 12101 SetNextEnumerationIndex(index + 1);
12058 } 12102 }
12059 SetEntry(entry, k, value, details); 12103 SetEntry(entry, k, value, details);
12060 ASSERT((Dictionary<Shape, Key>::KeyAt(entry)->IsNumber() 12104 ASSERT((Dictionary<Shape, Key>::KeyAt(entry)->IsNumber()
12061 || Dictionary<Shape, Key>::KeyAt(entry)->IsString())); 12105 || Dictionary<Shape, Key>::KeyAt(entry)->IsString()));
12062 HashTable<Shape, Key>::ElementAdded(); 12106 HashTable<Shape, Key>::ElementAdded();
12063 return this; 12107 return this;
12064 } 12108 }
12065 12109
12066 12110
12067 void NumberDictionary::UpdateMaxNumberKey(uint32_t key) { 12111 void NumberDictionaryBase::UpdateMaxNumberKey(uint32_t key) {
12068 // If the dictionary requires slow elements an element has already 12112 // If the dictionary requires slow elements an element has already
12069 // been added at a high index. 12113 // been added at a high index.
12070 if (requires_slow_elements()) return; 12114 if (requires_slow_elements()) return;
12071 // Check if this index is high enough that we should require slow 12115 // Check if this index is high enough that we should require slow
12072 // elements. 12116 // elements.
12073 if (key > kRequiresSlowElementsLimit) { 12117 if (key > kRequiresSlowElementsLimit) {
12074 set_requires_slow_elements(); 12118 set_requires_slow_elements();
12075 return; 12119 return;
12076 } 12120 }
12077 // Update max key value. 12121 // Update max key value.
12078 Object* max_index_object = get(kMaxNumberKeyIndex); 12122 Object* max_index_object = as_dict()->get(
12123 NumberDictionary::kMaxNumberKeyIndex);
12079 if (!max_index_object->IsSmi() || max_number_key() < key) { 12124 if (!max_index_object->IsSmi() || max_number_key() < key) {
12080 FixedArray::set(kMaxNumberKeyIndex, 12125 as_dict()->set(NumberDictionary::kMaxNumberKeyIndex,
12081 Smi::FromInt(key << kRequiresSlowElementsTagSize)); 12126 Smi::FromInt(key << kRequiresSlowElementsTagSize));
12082 } 12127 }
12083 } 12128 }
12084 12129
12085 12130
12086 MaybeObject* NumberDictionary::AddNumberEntry(uint32_t key, 12131 MaybeObject* NumberDictionaryBase::AddNumberEntry(uint32_t key,
12087 Object* value, 12132 Object* value,
12088 PropertyDetails details) { 12133 PropertyDetails details) {
12089 UpdateMaxNumberKey(key); 12134 UpdateMaxNumberKey(key);
12090 SLOW_ASSERT(this->FindEntry(key) == kNotFound); 12135 SLOW_ASSERT(as_dict()->FindEntry(key) == NumberDictionary::kNotFound);
12091 return Add(key, value, details); 12136 return as_dict()->Add(key, value, details);
12092 } 12137 }
12093 12138
12094 12139
12095 MaybeObject* NumberDictionary::AtNumberPut(uint32_t key, Object* value) { 12140 MaybeObject* NumberDictionaryBase::AtNumberPut(uint32_t key, Object* value) {
12096 UpdateMaxNumberKey(key); 12141 UpdateMaxNumberKey(key);
12097 return AtPut(key, value); 12142 return as_dict()->AtPut(key, value);
12098 } 12143 }
12099 12144
12100 12145
12146 MaybeObject* NumberDictionaryBase::Set(uint32_t key,
12147 Object* value,
12148 PropertyDetails details) {
12149 int entry = as_dict()->FindEntry(key);
12150 if (entry == NumberDictionary::kNotFound) {
12151 return AddNumberEntry(key, value, details);
12152 }
12153
12154 // Preserve enumeration index.
12155 details = PropertyDetails(details.attributes(),
12156 details.type(),
12157 as_dict()->DetailsAt(entry).index());
12158 MaybeObject* maybe_object_key = NumberDictionaryShape<kSeeded>::AsObject(key);
12159 Object* object_key;
12160 if (!maybe_object_key->ToObject(&object_key)) return maybe_object_key;
12161 as_dict()->SetEntry(entry, object_key, value, details);
12162 return as_dict();
12163 }
12164
12165
12101 Handle<NumberDictionary> NumberDictionary::Set( 12166 Handle<NumberDictionary> NumberDictionary::Set(
12102 Handle<NumberDictionary> dictionary, 12167 Handle<NumberDictionary> dictionary,
12103 uint32_t index, 12168 uint32_t index,
12104 Handle<Object> value, 12169 Handle<Object> value,
12105 PropertyDetails details) { 12170 PropertyDetails details) {
12106 CALL_HEAP_FUNCTION(dictionary->GetIsolate(), 12171 CALL_HEAP_FUNCTION(dictionary->GetIsolate(),
12107 dictionary->Set(index, *value, details), 12172 dictionary->Set(index, *value, details),
12108 NumberDictionary); 12173 NumberDictionary);
12109 } 12174 }
12110 12175
12111 12176
12112 MaybeObject* NumberDictionary::Set(uint32_t key, 12177 Handle<NotSeededNumberDictionary> NotSeededNumberDictionary::Set(
12113 Object* value, 12178 Handle<NotSeededNumberDictionary> dictionary,
12114 PropertyDetails details) { 12179 uint32_t index,
12115 int entry = FindEntry(key); 12180 Handle<Object> value,
12116 if (entry == kNotFound) return AddNumberEntry(key, value, details); 12181 PropertyDetails details) {
12117 // Preserve enumeration index. 12182 CALL_HEAP_FUNCTION(dictionary->GetIsolate(),
12118 details = PropertyDetails(details.attributes(), 12183 dictionary->Set(index, *value, details),
12119 details.type(), 12184 NotSeededNumberDictionary);
12120 DetailsAt(entry).index());
12121 MaybeObject* maybe_object_key = NumberDictionaryShape::AsObject(key);
12122 Object* object_key;
12123 if (!maybe_object_key->ToObject(&object_key)) return maybe_object_key;
12124 SetEntry(entry, object_key, value, details);
12125 return this;
12126 } 12185 }
12127 12186
12128 12187
12129
12130 template<typename Shape, typename Key> 12188 template<typename Shape, typename Key>
12131 int Dictionary<Shape, Key>::NumberOfElementsFilterAttributes( 12189 int Dictionary<Shape, Key>::NumberOfElementsFilterAttributes(
12132 PropertyAttributes filter) { 12190 PropertyAttributes filter) {
12133 int capacity = HashTable<Shape, Key>::Capacity(); 12191 int capacity = HashTable<Shape, Key>::Capacity();
12134 int result = 0; 12192 int result = 0;
12135 for (int i = 0; i < capacity; i++) { 12193 for (int i = 0; i < capacity; i++) {
12136 Object* k = HashTable<Shape, Key>::KeyAt(i); 12194 Object* k = HashTable<Shape, Key>::KeyAt(i);
12137 if (HashTable<Shape, Key>::IsKey(k)) { 12195 if (HashTable<Shape, Key>::IsKey(k)) {
12138 PropertyDetails details = DetailsAt(i); 12196 PropertyDetails details = DetailsAt(i);
12139 if (details.IsDeleted()) continue; 12197 if (details.IsDeleted()) continue;
(...skipping 603 matching lines...) Expand 10 before | Expand all | Expand 10 after
12743 if (break_point_objects()->IsUndefined()) return 0; 12801 if (break_point_objects()->IsUndefined()) return 0;
12744 // Single break point. 12802 // Single break point.
12745 if (!break_point_objects()->IsFixedArray()) return 1; 12803 if (!break_point_objects()->IsFixedArray()) return 1;
12746 // Multiple break points. 12804 // Multiple break points.
12747 return FixedArray::cast(break_point_objects())->length(); 12805 return FixedArray::cast(break_point_objects())->length();
12748 } 12806 }
12749 #endif // ENABLE_DEBUGGER_SUPPORT 12807 #endif // ENABLE_DEBUGGER_SUPPORT
12750 12808
12751 12809
12752 } } // namespace v8::internal 12810 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/objects-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698