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

Side by Side Diff: src/objects.cc

Issue 23477061: Make objects embedded in optimized code weak. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Fix arm Created 7 years, 2 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 | Annotate | Revision Log
« no previous file with comments | « src/objects.h ('k') | src/objects-debug.cc » ('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 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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 7717 matching lines...) Expand 10 before | Expand all | Expand 10 after
7728 for (int i = 0; i < result->length(); i++) { 7728 for (int i = 0; i < result->length(); i++) {
7729 Object* current = result->get(i); 7729 Object* current = result->get(i);
7730 ASSERT(current->IsNumber() || current->IsName()); 7730 ASSERT(current->IsNumber() || current->IsName());
7731 } 7731 }
7732 } 7732 }
7733 #endif 7733 #endif
7734 return result; 7734 return result;
7735 } 7735 }
7736 7736
7737 7737
7738 MaybeObject* FixedArray::CopySize(int new_length) { 7738 MaybeObject* FixedArray::CopySize(int new_length, PretenureFlag pretenure) {
7739 Heap* heap = GetHeap(); 7739 Heap* heap = GetHeap();
7740 if (new_length == 0) return heap->empty_fixed_array(); 7740 if (new_length == 0) return heap->empty_fixed_array();
7741 Object* obj; 7741 Object* obj;
7742 { MaybeObject* maybe_obj = heap->AllocateFixedArray(new_length); 7742 { MaybeObject* maybe_obj = heap->AllocateFixedArray(new_length, pretenure);
7743 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 7743 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
7744 } 7744 }
7745 FixedArray* result = FixedArray::cast(obj); 7745 FixedArray* result = FixedArray::cast(obj);
7746 // Copy the content 7746 // Copy the content
7747 DisallowHeapAllocation no_gc; 7747 DisallowHeapAllocation no_gc;
7748 int len = length(); 7748 int len = length();
7749 if (new_length < len) len = new_length; 7749 if (new_length < len) len = new_length;
7750 // We are taking the map from the old fixed array so the map is sure to 7750 // We are taking the map from the old fixed array so the map is sure to
7751 // be an immortal immutable object. 7751 // be an immortal immutable object.
7752 result->set_map_no_write_barrier(map()); 7752 result->set_map_no_write_barrier(map());
(...skipping 3265 matching lines...) Expand 10 before | Expand all | Expand 10 after
11018 GetElementsKind(), new_elements); 11018 GetElementsKind(), new_elements);
11019 } 11019 }
11020 11020
11021 if (IsJSArray()) { 11021 if (IsJSArray()) {
11022 JSArray::cast(this)->set_length(Smi::FromInt(length)); 11022 JSArray::cast(this)->set_length(Smi::FromInt(length));
11023 } 11023 }
11024 return new_elements; 11024 return new_elements;
11025 } 11025 }
11026 11026
11027 11027
11028 bool Code::IsWeakEmbeddedObject(Kind kind, Object* object) {
11029 if (kind != Code::OPTIMIZED_FUNCTION) return false;
11030
11031 if (object->IsMap()) {
11032 return Map::cast(object)->CanTransition() &&
11033 FLAG_collect_maps &&
11034 FLAG_weak_embedded_maps_in_optimized_code;
11035 }
11036
11037 if (object->IsJSObject()) {
11038 return FLAG_weak_embedded_objects_in_optimized_code;
11039 }
11040
11041 return false;
11042 }
11043
11028 MaybeObject* JSObject::SetFastDoubleElementsCapacityAndLength( 11044 MaybeObject* JSObject::SetFastDoubleElementsCapacityAndLength(
11029 int capacity, 11045 int capacity,
11030 int length) { 11046 int length) {
11031 Heap* heap = GetHeap(); 11047 Heap* heap = GetHeap();
11032 // We should never end in here with a pixel or external array. 11048 // We should never end in here with a pixel or external array.
11033 ASSERT(!HasExternalArrayElements()); 11049 ASSERT(!HasExternalArrayElements());
11034 ASSERT(!map()->is_observed()); 11050 ASSERT(!map()->is_observed());
11035 11051
11036 FixedArrayBase* elems; 11052 FixedArrayBase* elems;
11037 { MaybeObject* maybe_obj = 11053 { MaybeObject* maybe_obj =
(...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after
11378 // Do not append the compilation info if it is already in the array. 11394 // Do not append the compilation info if it is already in the array.
11379 // It is sufficient to just check only the last element because 11395 // It is sufficient to just check only the last element because
11380 // we process embedded maps of an optimized code in one batch. 11396 // we process embedded maps of an optimized code in one batch.
11381 return entries; 11397 return entries;
11382 } 11398 }
11383 if (entries->length() < kCodesStartIndex + number_of_entries + 1) { 11399 if (entries->length() < kCodesStartIndex + number_of_entries + 1) {
11384 Factory* factory = entries->GetIsolate()->factory(); 11400 Factory* factory = entries->GetIsolate()->factory();
11385 int capacity = kCodesStartIndex + number_of_entries + 1; 11401 int capacity = kCodesStartIndex + number_of_entries + 1;
11386 if (capacity > 5) capacity = capacity * 5 / 4; 11402 if (capacity > 5) capacity = capacity * 5 / 4;
11387 Handle<DependentCode> new_entries = Handle<DependentCode>::cast( 11403 Handle<DependentCode> new_entries = Handle<DependentCode>::cast(
11388 factory->CopySizeFixedArray(entries, capacity)); 11404 factory->CopySizeFixedArray(entries, capacity, TENURED));
11389 // The number of codes can change after GC. 11405 // The number of codes can change after GC.
11390 starts.Recompute(*entries); 11406 starts.Recompute(*entries);
11391 start = starts.at(group); 11407 start = starts.at(group);
11392 end = starts.at(group + 1); 11408 end = starts.at(group + 1);
11393 number_of_entries = starts.number_of_entries(); 11409 number_of_entries = starts.number_of_entries();
11394 for (int i = 0; i < number_of_entries; i++) { 11410 for (int i = 0; i < number_of_entries; i++) {
11395 entries->clear_at(i); 11411 entries->clear_at(i);
11396 } 11412 }
11397 // If the old fixed array was empty, we need to reset counters of the 11413 // If the old fixed array was empty, we need to reset counters of the
11398 // new array. 11414 // new array.
(...skipping 2484 matching lines...) Expand 10 before | Expand all | Expand 10 after
13883 // for the next probe. 13899 // for the next probe.
13884 done = false; 13900 done = false;
13885 } 13901 }
13886 } 13902 }
13887 } 13903 }
13888 } 13904 }
13889 } 13905 }
13890 13906
13891 13907
13892 template<typename Shape, typename Key> 13908 template<typename Shape, typename Key>
13893 MaybeObject* HashTable<Shape, Key>::EnsureCapacity(int n, Key key) { 13909 MaybeObject* HashTable<Shape, Key>::EnsureCapacity(int n,
13910 Key key,
13911 PretenureFlag pretenure) {
13894 int capacity = Capacity(); 13912 int capacity = Capacity();
13895 int nof = NumberOfElements() + n; 13913 int nof = NumberOfElements() + n;
13896 int nod = NumberOfDeletedElements(); 13914 int nod = NumberOfDeletedElements();
13897 // Return if: 13915 // Return if:
13898 // 50% is still free after adding n elements and 13916 // 50% is still free after adding n elements and
13899 // at most 50% of the free elements are deleted elements. 13917 // at most 50% of the free elements are deleted elements.
13900 if (nod <= (capacity - nof) >> 1) { 13918 if (nod <= (capacity - nof) >> 1) {
13901 int needed_free = nof >> 1; 13919 int needed_free = nof >> 1;
13902 if (nof + needed_free <= capacity) return this; 13920 if (nof + needed_free <= capacity) return this;
13903 } 13921 }
13904 13922
13905 const int kMinCapacityForPretenure = 256; 13923 const int kMinCapacityForPretenure = 256;
13906 bool pretenure = 13924 bool should_pretenure = pretenure == TENURED ||
13907 (capacity > kMinCapacityForPretenure) && !GetHeap()->InNewSpace(this); 13925 ((capacity > kMinCapacityForPretenure) && !GetHeap()->InNewSpace(this));
13908 Object* obj; 13926 Object* obj;
13909 { MaybeObject* maybe_obj = 13927 { MaybeObject* maybe_obj =
13910 Allocate(GetHeap(), 13928 Allocate(GetHeap(),
13911 nof * 2, 13929 nof * 2,
13912 USE_DEFAULT_MINIMUM_CAPACITY, 13930 USE_DEFAULT_MINIMUM_CAPACITY,
13913 pretenure ? TENURED : NOT_TENURED); 13931 should_pretenure ? TENURED : NOT_TENURED);
13914 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 13932 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
13915 } 13933 }
13916 13934
13917 return Rehash(HashTable::cast(obj), key); 13935 return Rehash(HashTable::cast(obj), key);
13918 } 13936 }
13919 13937
13920 13938
13921 template<typename Shape, typename Key> 13939 template<typename Shape, typename Key>
13922 MaybeObject* HashTable<Shape, Key>::Shrink(Key key) { 13940 MaybeObject* HashTable<Shape, Key>::Shrink(Key key) {
13923 int capacity = Capacity(); 13941 int capacity = Capacity();
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
13971 template class HashTable<StringTableShape, HashTableKey*>; 13989 template class HashTable<StringTableShape, HashTableKey*>;
13972 13990
13973 template class HashTable<CompilationCacheShape, HashTableKey*>; 13991 template class HashTable<CompilationCacheShape, HashTableKey*>;
13974 13992
13975 template class HashTable<MapCacheShape, HashTableKey*>; 13993 template class HashTable<MapCacheShape, HashTableKey*>;
13976 13994
13977 template class HashTable<ObjectHashTableShape<1>, Object*>; 13995 template class HashTable<ObjectHashTableShape<1>, Object*>;
13978 13996
13979 template class HashTable<ObjectHashTableShape<2>, Object*>; 13997 template class HashTable<ObjectHashTableShape<2>, Object*>;
13980 13998
13999 template class HashTable<WeakHashTableShape<2>, Object*>;
14000
13981 template class Dictionary<NameDictionaryShape, Name*>; 14001 template class Dictionary<NameDictionaryShape, Name*>;
13982 14002
13983 template class Dictionary<SeededNumberDictionaryShape, uint32_t>; 14003 template class Dictionary<SeededNumberDictionaryShape, uint32_t>;
13984 14004
13985 template class Dictionary<UnseededNumberDictionaryShape, uint32_t>; 14005 template class Dictionary<UnseededNumberDictionaryShape, uint32_t>;
13986 14006
13987 template MaybeObject* Dictionary<SeededNumberDictionaryShape, uint32_t>:: 14007 template MaybeObject* Dictionary<SeededNumberDictionaryShape, uint32_t>::
13988 Allocate(Heap* heap, int at_least_space_for, PretenureFlag pretenure); 14008 Allocate(Heap* heap, int at_least_space_for, PretenureFlag pretenure);
13989 14009
13990 template MaybeObject* Dictionary<UnseededNumberDictionaryShape, uint32_t>:: 14010 template MaybeObject* Dictionary<UnseededNumberDictionaryShape, uint32_t>::
(...skipping 1622 matching lines...) Expand 10 before | Expand all | Expand 10 after
15613 } 15633 }
15614 15634
15615 15635
15616 void ObjectHashTable::RemoveEntry(int entry) { 15636 void ObjectHashTable::RemoveEntry(int entry) {
15617 set_the_hole(EntryToIndex(entry)); 15637 set_the_hole(EntryToIndex(entry));
15618 set_the_hole(EntryToIndex(entry) + 1); 15638 set_the_hole(EntryToIndex(entry) + 1);
15619 ElementRemoved(); 15639 ElementRemoved();
15620 } 15640 }
15621 15641
15622 15642
15643 Object* WeakHashTable::Lookup(Object* key) {
15644 ASSERT(IsKey(key));
15645 int entry = FindEntry(key);
15646 if (entry == kNotFound) return GetHeap()->the_hole_value();
15647 return get(EntryToValueIndex(entry));
15648 }
15649
15650
15651 MaybeObject* WeakHashTable::Put(Object* key, Object* value) {
15652 ASSERT(IsKey(key));
15653 int entry = FindEntry(key);
15654 // Key is already in table, just overwrite value.
15655 if (entry != kNotFound) {
15656 set(EntryToValueIndex(entry), value);
15657 return this;
15658 }
15659
15660 // Check whether the hash table should be extended.
15661 Object* obj;
15662 { MaybeObject* maybe_obj = EnsureCapacity(1, key, TENURED);
15663 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
15664 }
15665 WeakHashTable* table = WeakHashTable::cast(obj);
15666 table->AddEntry(table->FindInsertionEntry(Hash(key)), key, value);
15667 return table;
15668 }
15669
15670
15671 void WeakHashTable::AddEntry(int entry, Object* key, Object* value) {
15672 set(EntryToIndex(entry), key);
15673 set(EntryToValueIndex(entry), value);
15674 ElementAdded();
15675 }
15676
15677
15623 DeclaredAccessorDescriptorIterator::DeclaredAccessorDescriptorIterator( 15678 DeclaredAccessorDescriptorIterator::DeclaredAccessorDescriptorIterator(
15624 DeclaredAccessorDescriptor* descriptor) 15679 DeclaredAccessorDescriptor* descriptor)
15625 : array_(descriptor->serialized_data()->GetDataStartAddress()), 15680 : array_(descriptor->serialized_data()->GetDataStartAddress()),
15626 length_(descriptor->serialized_data()->length()), 15681 length_(descriptor->serialized_data()->length()),
15627 offset_(0) { 15682 offset_(0) {
15628 } 15683 }
15629 15684
15630 15685
15631 const DeclaredAccessorDescriptorData* 15686 const DeclaredAccessorDescriptorData*
15632 DeclaredAccessorDescriptorIterator::Next() { 15687 DeclaredAccessorDescriptorIterator::Next() {
(...skipping 536 matching lines...) Expand 10 before | Expand all | Expand 10 after
16169 #define ERROR_MESSAGES_TEXTS(C, T) T, 16224 #define ERROR_MESSAGES_TEXTS(C, T) T,
16170 static const char* error_messages_[] = { 16225 static const char* error_messages_[] = {
16171 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) 16226 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS)
16172 }; 16227 };
16173 #undef ERROR_MESSAGES_TEXTS 16228 #undef ERROR_MESSAGES_TEXTS
16174 return error_messages_[reason]; 16229 return error_messages_[reason];
16175 } 16230 }
16176 16231
16177 16232
16178 } } // namespace v8::internal 16233 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/objects-debug.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698