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 14825 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14836 | 14836 |
14837 void WeakHashTable::AddEntry(int entry, Handle<WeakCell> key_cell, | 14837 void WeakHashTable::AddEntry(int entry, Handle<WeakCell> key_cell, |
14838 Handle<HeapObject> value) { | 14838 Handle<HeapObject> value) { |
14839 DisallowHeapAllocation no_allocation; | 14839 DisallowHeapAllocation no_allocation; |
14840 set(EntryToIndex(entry), *key_cell); | 14840 set(EntryToIndex(entry), *key_cell); |
14841 set(EntryToValueIndex(entry), *value); | 14841 set(EntryToValueIndex(entry), *value); |
14842 ElementAdded(); | 14842 ElementAdded(); |
14843 } | 14843 } |
14844 | 14844 |
14845 | 14845 |
14846 #ifdef DEBUG | |
14847 Object* WeakValueHashTable::LookupWeak(Handle<Object> key) { | |
14848 Object* value = Lookup(key); | |
14849 if (value->IsWeakCell() && !WeakCell::cast(value)->cleared()) { | |
14850 value = WeakCell::cast(value)->value(); | |
14851 } | |
14852 return value; | |
14853 } | |
14854 #endif // DEBUG | |
14855 | |
14856 | |
14857 Handle<WeakValueHashTable> WeakValueHashTable::PutWeak( | |
14858 Handle<WeakValueHashTable> table, Handle<Object> key, | |
14859 Handle<HeapObject> value) { | |
14860 Handle<WeakCell> cell = value->GetIsolate()->factory()->NewWeakCell(value); | |
14861 return Handle<WeakValueHashTable>::cast( | |
14862 Put(Handle<ObjectHashTable>::cast(table), key, cell)); | |
14863 } | |
14864 | |
14865 | |
14866 Handle<FixedArray> WeakValueHashTable::GetWeakValues( | |
14867 Handle<WeakValueHashTable> table) { | |
14868 Isolate* isolate = table->GetIsolate(); | |
14869 uint32_t capacity = table->Capacity(); | |
14870 Handle<FixedArray> results = isolate->factory()->NewFixedArray(capacity); | |
14871 int length = 0; | |
14872 for (uint32_t i = 0; i < capacity; i++) { | |
14873 uint32_t key_index = table->EntryToIndex(i); | |
14874 Object* key = table->get(key_index); | |
14875 if (!table->IsKey(key)) continue; | |
14876 uint32_t value_index = table->EntryToValueIndex(i); | |
14877 WeakCell* value_cell = WeakCell::cast(table->get(value_index)); | |
14878 if (value_cell->cleared()) { | |
14879 table->RemoveEntry(i); | |
14880 } else { | |
14881 results->set(length++, value_cell->value()); | |
14882 } | |
14883 } | |
14884 results->Shrink(length); | |
14885 return results; | |
14886 } | |
14887 | |
14888 | |
14889 template<class Derived, class Iterator, int entrysize> | 14846 template<class Derived, class Iterator, int entrysize> |
14890 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Allocate( | 14847 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Allocate( |
14891 Isolate* isolate, int capacity, PretenureFlag pretenure) { | 14848 Isolate* isolate, int capacity, PretenureFlag pretenure) { |
14892 // Capacity must be a power of two, since we depend on being able | 14849 // Capacity must be a power of two, since we depend on being able |
14893 // to divide and multiple by 2 (kLoadFactor) to derive capacity | 14850 // to divide and multiple by 2 (kLoadFactor) to derive capacity |
14894 // from number of buckets. If we decide to change kLoadFactor | 14851 // from number of buckets. If we decide to change kLoadFactor |
14895 // to something other than 2, capacity should be stored as another | 14852 // to something other than 2, capacity should be stored as another |
14896 // field of this object. | 14853 // field of this object. |
14897 capacity = base::bits::RoundUpToPowerOfTwo32(Max(kMinCapacity, capacity)); | 14854 capacity = base::bits::RoundUpToPowerOfTwo32(Max(kMinCapacity, capacity)); |
14898 if (capacity > kMaxCapacity) { | 14855 if (capacity > kMaxCapacity) { |
(...skipping 818 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15717 if (cell->value() != *new_value) { | 15674 if (cell->value() != *new_value) { |
15718 cell->set_value(*new_value); | 15675 cell->set_value(*new_value); |
15719 Isolate* isolate = cell->GetIsolate(); | 15676 Isolate* isolate = cell->GetIsolate(); |
15720 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 15677 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
15721 isolate, DependentCode::kPropertyCellChangedGroup); | 15678 isolate, DependentCode::kPropertyCellChangedGroup); |
15722 } | 15679 } |
15723 } | 15680 } |
15724 | 15681 |
15725 } // namespace internal | 15682 } // namespace internal |
15726 } // namespace v8 | 15683 } // namespace v8 |
OLD | NEW |