Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index 132a8222a9a6c959f8d1ff3e5c4c698d1dff6694..7582b030cb122f4aeb2e710436b88443a0d16821 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -7735,11 +7735,11 @@ MaybeObject* FixedArray::UnionOfKeys(FixedArray* other) { |
} |
-MaybeObject* FixedArray::CopySize(int new_length) { |
+MaybeObject* FixedArray::CopySize(int new_length, PretenureFlag pretenure) { |
Heap* heap = GetHeap(); |
if (new_length == 0) return heap->empty_fixed_array(); |
Object* obj; |
- { MaybeObject* maybe_obj = heap->AllocateFixedArray(new_length); |
+ { MaybeObject* maybe_obj = heap->AllocateFixedArray(new_length, pretenure); |
if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
} |
FixedArray* result = FixedArray::cast(obj); |
@@ -11025,6 +11025,22 @@ MaybeObject* JSObject::SetFastElementsCapacityAndLength( |
} |
+bool Code::IsWeakEmbeddedObject(Kind kind, Object* object) { |
+ if (kind != Code::OPTIMIZED_FUNCTION) return false; |
+ |
+ if (object->IsMap()) { |
+ return Map::cast(object)->CanTransition() && |
+ FLAG_collect_maps && |
+ FLAG_weak_embedded_maps_in_optimized_code; |
+ } |
+ |
+ if (object->IsJSObject()) { |
+ return FLAG_weak_embedded_objects_in_optimized_code; |
+ } |
+ |
+ return false; |
+} |
+ |
MaybeObject* JSObject::SetFastDoubleElementsCapacityAndLength( |
int capacity, |
int length) { |
@@ -11385,7 +11401,7 @@ Handle<DependentCode> DependentCode::Insert(Handle<DependentCode> entries, |
int capacity = kCodesStartIndex + number_of_entries + 1; |
if (capacity > 5) capacity = capacity * 5 / 4; |
Handle<DependentCode> new_entries = Handle<DependentCode>::cast( |
- factory->CopySizeFixedArray(entries, capacity)); |
+ factory->CopySizeFixedArray(entries, capacity, TENURED)); |
// The number of codes can change after GC. |
starts.Recompute(*entries); |
start = starts.at(group); |
@@ -13890,7 +13906,9 @@ void HashTable<Shape, Key>::Rehash(Key key) { |
template<typename Shape, typename Key> |
-MaybeObject* HashTable<Shape, Key>::EnsureCapacity(int n, Key key) { |
+MaybeObject* HashTable<Shape, Key>::EnsureCapacity(int n, |
+ Key key, |
+ PretenureFlag pretenure) { |
int capacity = Capacity(); |
int nof = NumberOfElements() + n; |
int nod = NumberOfDeletedElements(); |
@@ -13903,14 +13921,14 @@ MaybeObject* HashTable<Shape, Key>::EnsureCapacity(int n, Key key) { |
} |
const int kMinCapacityForPretenure = 256; |
- bool pretenure = |
- (capacity > kMinCapacityForPretenure) && !GetHeap()->InNewSpace(this); |
+ bool should_pretenure = pretenure == TENURED || |
+ ((capacity > kMinCapacityForPretenure) && !GetHeap()->InNewSpace(this)); |
Object* obj; |
{ MaybeObject* maybe_obj = |
Allocate(GetHeap(), |
nof * 2, |
USE_DEFAULT_MINIMUM_CAPACITY, |
- pretenure ? TENURED : NOT_TENURED); |
+ should_pretenure ? TENURED : NOT_TENURED); |
if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
} |
@@ -13978,6 +13996,8 @@ template class HashTable<ObjectHashTableShape<1>, Object*>; |
template class HashTable<ObjectHashTableShape<2>, Object*>; |
+template class HashTable<WeakHashTableShape<2>, Object*>; |
+ |
template class Dictionary<NameDictionaryShape, Name*>; |
template class Dictionary<SeededNumberDictionaryShape, uint32_t>; |
@@ -15620,6 +15640,41 @@ void ObjectHashTable::RemoveEntry(int entry) { |
} |
+Object* WeakHashTable::Lookup(Object* key) { |
+ ASSERT(IsKey(key)); |
+ int entry = FindEntry(key); |
+ if (entry == kNotFound) return GetHeap()->the_hole_value(); |
+ return get(EntryToValueIndex(entry)); |
+} |
+ |
+ |
+MaybeObject* WeakHashTable::Put(Object* key, Object* value) { |
+ ASSERT(IsKey(key)); |
+ int entry = FindEntry(key); |
+ // Key is already in table, just overwrite value. |
+ if (entry != kNotFound) { |
+ set(EntryToValueIndex(entry), value); |
+ return this; |
+ } |
+ |
+ // Check whether the hash table should be extended. |
+ Object* obj; |
+ { MaybeObject* maybe_obj = EnsureCapacity(1, key, TENURED); |
+ if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
+ } |
+ WeakHashTable* table = WeakHashTable::cast(obj); |
+ table->AddEntry(table->FindInsertionEntry(Hash(key)), key, value); |
+ return table; |
+} |
+ |
+ |
+void WeakHashTable::AddEntry(int entry, Object* key, Object* value) { |
+ set(EntryToIndex(entry), key); |
+ set(EntryToValueIndex(entry), value); |
+ ElementAdded(); |
+} |
+ |
+ |
DeclaredAccessorDescriptorIterator::DeclaredAccessorDescriptorIterator( |
DeclaredAccessorDescriptor* descriptor) |
: array_(descriptor->serialized_data()->GetDataStartAddress()), |