OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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 "src/objects.h" | 5 #include "src/objects.h" |
6 | 6 |
7 #include <cmath> | 7 #include <cmath> |
8 #include <iomanip> | 8 #include <iomanip> |
9 #include <sstream> | 9 #include <sstream> |
10 | 10 |
(...skipping 16849 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16860 // The other element will be processed on the next iteration. | 16860 // The other element will be processed on the next iteration. |
16861 current--; | 16861 current--; |
16862 } else { | 16862 } else { |
16863 // The place for the current element is occupied. Leave the element | 16863 // The place for the current element is occupied. Leave the element |
16864 // for the next probe. | 16864 // for the next probe. |
16865 done = false; | 16865 done = false; |
16866 } | 16866 } |
16867 } | 16867 } |
16868 } | 16868 } |
16869 } | 16869 } |
| 16870 // Wipe deleted entries. |
| 16871 Heap* heap = GetHeap(); |
| 16872 Object* the_hole = heap->the_hole_value(); |
| 16873 Object* undefined = heap->undefined_value(); |
| 16874 for (uint32_t current = 0; current < capacity; current++) { |
| 16875 if (get(EntryToIndex(current)) == the_hole) { |
| 16876 set(EntryToIndex(current), undefined); |
| 16877 } |
| 16878 } |
| 16879 SetNumberOfDeletedElements(0); |
16870 } | 16880 } |
16871 | 16881 |
16872 | 16882 |
16873 template<typename Derived, typename Shape, typename Key> | 16883 template<typename Derived, typename Shape, typename Key> |
16874 Handle<Derived> HashTable<Derived, Shape, Key>::EnsureCapacity( | 16884 Handle<Derived> HashTable<Derived, Shape, Key>::EnsureCapacity( |
16875 Handle<Derived> table, | 16885 Handle<Derived> table, |
16876 int n, | 16886 int n, |
16877 Key key, | 16887 Key key, |
16878 PretenureFlag pretenure) { | 16888 PretenureFlag pretenure) { |
16879 Isolate* isolate = table->GetIsolate(); | 16889 Isolate* isolate = table->GetIsolate(); |
(...skipping 1330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
18210 Isolate* isolate = table->GetIsolate(); | 18220 Isolate* isolate = table->GetIsolate(); |
18211 | 18221 |
18212 int entry = table->FindEntry(isolate, key, hash); | 18222 int entry = table->FindEntry(isolate, key, hash); |
18213 | 18223 |
18214 // Key is already in table, just overwrite value. | 18224 // Key is already in table, just overwrite value. |
18215 if (entry != kNotFound) { | 18225 if (entry != kNotFound) { |
18216 table->set(EntryToIndex(entry) + 1, *value); | 18226 table->set(EntryToIndex(entry) + 1, *value); |
18217 return table; | 18227 return table; |
18218 } | 18228 } |
18219 | 18229 |
| 18230 // Rehash if more than 25% of the entries are deleted entries. |
| 18231 // TODO(jochen): Consider to shrink the fixed array in place. |
| 18232 if ((table->NumberOfDeletedElements() << 1) > table->NumberOfElements()) { |
| 18233 table->Rehash(isolate->factory()->undefined_value()); |
| 18234 } |
| 18235 |
18220 // Check whether the hash table should be extended. | 18236 // Check whether the hash table should be extended. |
18221 table = EnsureCapacity(table, 1, key); | 18237 table = EnsureCapacity(table, 1, key); |
18222 table->AddEntry(table->FindInsertionEntry(hash), *key, *value); | 18238 table->AddEntry(table->FindInsertionEntry(hash), *key, *value); |
18223 return table; | 18239 return table; |
18224 } | 18240 } |
18225 | 18241 |
18226 | 18242 |
18227 Handle<ObjectHashTable> ObjectHashTable::Remove(Handle<ObjectHashTable> table, | 18243 Handle<ObjectHashTable> ObjectHashTable::Remove(Handle<ObjectHashTable> table, |
18228 Handle<Object> key, | 18244 Handle<Object> key, |
18229 bool* was_present) { | 18245 bool* was_present) { |
(...skipping 1144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
19374 if (cell->value() != *new_value) { | 19390 if (cell->value() != *new_value) { |
19375 cell->set_value(*new_value); | 19391 cell->set_value(*new_value); |
19376 Isolate* isolate = cell->GetIsolate(); | 19392 Isolate* isolate = cell->GetIsolate(); |
19377 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 19393 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
19378 isolate, DependentCode::kPropertyCellChangedGroup); | 19394 isolate, DependentCode::kPropertyCellChangedGroup); |
19379 } | 19395 } |
19380 } | 19396 } |
19381 | 19397 |
19382 } // namespace internal | 19398 } // namespace internal |
19383 } // namespace v8 | 19399 } // namespace v8 |
OLD | NEW |