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

Side by Side Diff: src/objects.cc

Issue 688853007: Implement aging of maps embedded in optimized code. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 1 month 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 | Annotate | Revision Log
OLDNEW
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 <sstream> 5 #include <sstream>
6 6
7 #include "src/v8.h" 7 #include "src/v8.h"
8 8
9 #include "src/accessors.h" 9 #include "src/accessors.h"
10 #include "src/allocation-site-scopes.h" 10 #include "src/allocation-site-scopes.h"
(...skipping 14193 matching lines...) Expand 10 before | Expand all | Expand 10 after
14204 template class HashTable<StringTable, StringTableShape, HashTableKey*>; 14204 template class HashTable<StringTable, StringTableShape, HashTableKey*>;
14205 14205
14206 template class HashTable<CompilationCacheTable, 14206 template class HashTable<CompilationCacheTable,
14207 CompilationCacheShape, 14207 CompilationCacheShape,
14208 HashTableKey*>; 14208 HashTableKey*>;
14209 14209
14210 template class HashTable<ObjectHashTable, 14210 template class HashTable<ObjectHashTable,
14211 ObjectHashTableShape, 14211 ObjectHashTableShape,
14212 Handle<Object> >; 14212 Handle<Object> >;
14213 14213
14214 template class HashTable<WeakHashTable, WeakHashTableShape<2>, Handle<Object> >; 14214 template class HashTable<WeakHashTable, HeapPointerShape<2>, Handle<Object> >;
14215
14216 template class HashTable<EmbeddedMapCache, HeapPointerShape<2>,
14217 Handle<Object> >;
14215 14218
14216 template class Dictionary<NameDictionary, NameDictionaryShape, Handle<Name> >; 14219 template class Dictionary<NameDictionary, NameDictionaryShape, Handle<Name> >;
14217 14220
14218 template class Dictionary<SeededNumberDictionary, 14221 template class Dictionary<SeededNumberDictionary,
14219 SeededNumberDictionaryShape, 14222 SeededNumberDictionaryShape,
14220 uint32_t>; 14223 uint32_t>;
14221 14224
14222 template class Dictionary<UnseededNumberDictionary, 14225 template class Dictionary<UnseededNumberDictionary,
14223 UnseededNumberDictionaryShape, 14226 UnseededNumberDictionaryShape,
14224 uint32_t>; 14227 uint32_t>;
(...skipping 1458 matching lines...) Expand 10 before | Expand all | Expand 10 after
15683 DisallowHeapAllocation no_allocation; 15686 DisallowHeapAllocation no_allocation;
15684 // TODO(ulan): Skipping write barrier is a temporary solution to avoid 15687 // TODO(ulan): Skipping write barrier is a temporary solution to avoid
15685 // memory leaks. Remove this once we have special visitor for weak fixed 15688 // memory leaks. Remove this once we have special visitor for weak fixed
15686 // arrays. 15689 // arrays.
15687 set(EntryToIndex(entry), *key, SKIP_WRITE_BARRIER); 15690 set(EntryToIndex(entry), *key, SKIP_WRITE_BARRIER);
15688 set(EntryToValueIndex(entry), *value, SKIP_WRITE_BARRIER); 15691 set(EntryToValueIndex(entry), *value, SKIP_WRITE_BARRIER);
15689 ElementAdded(); 15692 ElementAdded();
15690 } 15693 }
15691 15694
15692 15695
15696 Handle<EmbeddedMapCache> EmbeddedMapCache::Put(Handle<EmbeddedMapCache> table,
15697 Handle<Map> key) {
15698 DCHECK(table->IsKey(*key));
15699 int entry = table->FindEntry(key);
15700 // Key is already in table, just overwrite value.
15701 if (entry != kNotFound) {
15702 table->set(EntryToValueIndex(entry), Smi::FromInt(0), SKIP_WRITE_BARRIER);
15703 return table;
15704 }
15705
15706 // Check whether the hash table should be extended.
15707 table = EnsureCapacity(table, 1, key, TENURED);
15708 DisallowHeapAllocation no_allocation;
15709 entry = table->FindInsertionEntry(table->Hash(key));
15710 table->set(EntryToIndex(entry), *key);
15711 table->set(EntryToValueIndex(entry), Smi::FromInt(0), SKIP_WRITE_BARRIER);
15712 table->ElementAdded();
15713 return table;
15714 }
15715
15716
15717 void EmbeddedMapCache::Age() {
15718 int capacity = Capacity();
15719 for (int i = 0; i < capacity; i++) {
15720 Object* value = get(EntryToValueIndex(i));
15721 if (value->IsSmi()) {
15722 int age = Smi::cast(value)->value();
15723 if (age > kMaxAge) {
15724 set_the_hole(EntryToIndex(i));
15725 set_the_hole(EntryToIndex(i) + 1);
15726 ElementRemoved();
15727 } else {
15728 set(EntryToValueIndex(i), Smi::FromInt(age + 1), SKIP_WRITE_BARRIER);
15729 }
15730 }
15731 }
15732 }
15733
15734
15693 template<class Derived, class Iterator, int entrysize> 15735 template<class Derived, class Iterator, int entrysize>
15694 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Allocate( 15736 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Allocate(
15695 Isolate* isolate, int capacity, PretenureFlag pretenure) { 15737 Isolate* isolate, int capacity, PretenureFlag pretenure) {
15696 // Capacity must be a power of two, since we depend on being able 15738 // Capacity must be a power of two, since we depend on being able
15697 // to divide and multiple by 2 (kLoadFactor) to derive capacity 15739 // to divide and multiple by 2 (kLoadFactor) to derive capacity
15698 // from number of buckets. If we decide to change kLoadFactor 15740 // from number of buckets. If we decide to change kLoadFactor
15699 // to something other than 2, capacity should be stored as another 15741 // to something other than 2, capacity should be stored as another
15700 // field of this object. 15742 // field of this object.
15701 capacity = base::bits::RoundUpToPowerOfTwo32(Max(kMinCapacity, capacity)); 15743 capacity = base::bits::RoundUpToPowerOfTwo32(Max(kMinCapacity, capacity));
15702 if (capacity > kMaxCapacity) { 15744 if (capacity > kMaxCapacity) {
(...skipping 961 matching lines...) Expand 10 before | Expand all | Expand 10 after
16664 Handle<DependentCode> codes = 16706 Handle<DependentCode> codes =
16665 DependentCode::Insert(handle(cell->dependent_code(), info->isolate()), 16707 DependentCode::Insert(handle(cell->dependent_code(), info->isolate()),
16666 DependentCode::kPropertyCellChangedGroup, 16708 DependentCode::kPropertyCellChangedGroup,
16667 info->object_wrapper()); 16709 info->object_wrapper());
16668 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes); 16710 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes);
16669 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add( 16711 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add(
16670 cell, info->zone()); 16712 cell, info->zone());
16671 } 16713 }
16672 16714
16673 } } // namespace v8::internal 16715 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698