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

Side by Side Diff: src/heap/heap.cc

Issue 871253005: Use weak cells in dependent code. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Address comments Created 5 years, 10 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
« no previous file with comments | « src/heap/heap.h ('k') | src/heap/incremental-marking.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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/accessors.h" 7 #include "src/accessors.h"
8 #include "src/api.h" 8 #include "src/api.h"
9 #include "src/base/bits.h" 9 #include "src/base/bits.h"
10 #include "src/base/once.h" 10 #include "src/base/once.h"
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 sweeping_time_(0.0), 128 sweeping_time_(0.0),
129 last_idle_notification_time_(0.0), 129 last_idle_notification_time_(0.0),
130 mark_compact_collector_(this), 130 mark_compact_collector_(this),
131 store_buffer_(this), 131 store_buffer_(this),
132 marking_(this), 132 marking_(this),
133 incremental_marking_(this), 133 incremental_marking_(this),
134 gc_count_at_last_idle_gc_(0), 134 gc_count_at_last_idle_gc_(0),
135 full_codegen_bytes_generated_(0), 135 full_codegen_bytes_generated_(0),
136 crankshaft_codegen_bytes_generated_(0), 136 crankshaft_codegen_bytes_generated_(0),
137 gcs_since_last_deopt_(0), 137 gcs_since_last_deopt_(0),
138 #ifdef VERIFY_HEAP
139 no_weak_object_verification_scope_depth_(0),
140 #endif
141 allocation_sites_scratchpad_length_(0), 138 allocation_sites_scratchpad_length_(0),
142 promotion_queue_(this), 139 promotion_queue_(this),
143 configured_(false), 140 configured_(false),
144 external_string_table_(this), 141 external_string_table_(this),
145 chunks_queued_for_free_(NULL), 142 chunks_queued_for_free_(NULL),
146 gc_callbacks_depth_(0), 143 gc_callbacks_depth_(0),
147 deserialization_complete_(false), 144 deserialization_complete_(false),
148 promotion_failure_(false) { 145 promotion_failure_(false) {
149 // Allow build-time customization of the max semispace size. Building 146 // Allow build-time customization of the max semispace size. Building
150 // V8 with snapshots and a non-default max semispace size is much 147 // V8 with snapshots and a non-default max semispace size is much
(...skipping 3011 matching lines...) Expand 10 before | Expand all | Expand 10 after
3162 dummy_vector->Set(FeedbackVectorICSlot(0), 3159 dummy_vector->Set(FeedbackVectorICSlot(0),
3163 *TypeFeedbackVector::MegamorphicSentinel(isolate()), 3160 *TypeFeedbackVector::MegamorphicSentinel(isolate()),
3164 SKIP_WRITE_BARRIER); 3161 SKIP_WRITE_BARRIER);
3165 set_keyed_load_dummy_vector(*dummy_vector); 3162 set_keyed_load_dummy_vector(*dummy_vector);
3166 } else { 3163 } else {
3167 set_keyed_load_dummy_vector(empty_fixed_array()); 3164 set_keyed_load_dummy_vector(empty_fixed_array());
3168 } 3165 }
3169 3166
3170 set_detached_contexts(empty_fixed_array()); 3167 set_detached_contexts(empty_fixed_array());
3171 3168
3169 set_weak_object_to_code_table(
3170 *WeakHashTable::New(isolate(), 16, USE_DEFAULT_MINIMUM_CAPACITY,
3171 TENURED));
3172
3172 Handle<SeededNumberDictionary> slow_element_dictionary = 3173 Handle<SeededNumberDictionary> slow_element_dictionary =
3173 SeededNumberDictionary::New(isolate(), 0, TENURED); 3174 SeededNumberDictionary::New(isolate(), 0, TENURED);
3174 slow_element_dictionary->set_requires_slow_elements(); 3175 slow_element_dictionary->set_requires_slow_elements();
3175 set_empty_slow_element_dictionary(*slow_element_dictionary); 3176 set_empty_slow_element_dictionary(*slow_element_dictionary);
3176 3177
3177 set_materialized_objects(*factory->NewFixedArray(0, TENURED)); 3178 set_materialized_objects(*factory->NewFixedArray(0, TENURED));
3178 3179
3179 // Handling of script id generation is in Factory::NewScript. 3180 // Handling of script id generation is in Factory::NewScript.
3180 set_last_script_id(Smi::FromInt(v8::UnboundScript::kNoScriptId)); 3181 set_last_script_id(Smi::FromInt(v8::UnboundScript::kNoScriptId));
3181 3182
(...skipping 2411 matching lines...) Expand 10 before | Expand all | Expand 10 after
5593 CreateApiObjects(); 5594 CreateApiObjects();
5594 5595
5595 // Create initial objects 5596 // Create initial objects
5596 CreateInitialObjects(); 5597 CreateInitialObjects();
5597 CHECK_EQ(0u, gc_count_); 5598 CHECK_EQ(0u, gc_count_);
5598 5599
5599 set_native_contexts_list(undefined_value()); 5600 set_native_contexts_list(undefined_value());
5600 set_array_buffers_list(undefined_value()); 5601 set_array_buffers_list(undefined_value());
5601 set_new_array_buffer_views_list(undefined_value()); 5602 set_new_array_buffer_views_list(undefined_value());
5602 set_allocation_sites_list(undefined_value()); 5603 set_allocation_sites_list(undefined_value());
5603 weak_object_to_code_table_ = undefined_value();
5604 return true; 5604 return true;
5605 } 5605 }
5606 5606
5607 5607
5608 void Heap::SetStackLimits() { 5608 void Heap::SetStackLimits() {
5609 DCHECK(isolate_ != NULL); 5609 DCHECK(isolate_ != NULL);
5610 DCHECK(isolate_ == isolate()); 5610 DCHECK(isolate_ == isolate());
5611 // On 64 bit machines, pointers are generally out of range of Smis. We write 5611 // On 64 bit machines, pointers are generally out of range of Smis. We write
5612 // something that looks like an out of range Smi to the GC. 5612 // something that looks like an out of range Smi to the GC.
5613 5613
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
5768 if (gc_epilogue_callbacks_[i].callback == callback) { 5768 if (gc_epilogue_callbacks_[i].callback == callback) {
5769 gc_epilogue_callbacks_.Remove(i); 5769 gc_epilogue_callbacks_.Remove(i);
5770 return; 5770 return;
5771 } 5771 }
5772 } 5772 }
5773 UNREACHABLE(); 5773 UNREACHABLE();
5774 } 5774 }
5775 5775
5776 5776
5777 // TODO(ishell): Find a better place for this. 5777 // TODO(ishell): Find a better place for this.
5778 void Heap::AddWeakObjectToCodeDependency(Handle<Object> obj, 5778 void Heap::AddWeakObjectToCodeDependency(Handle<HeapObject> obj,
5779 Handle<DependentCode> dep) { 5779 Handle<DependentCode> dep) {
5780 DCHECK(!InNewSpace(*obj)); 5780 DCHECK(!InNewSpace(*obj));
5781 DCHECK(!InNewSpace(*dep)); 5781 DCHECK(!InNewSpace(*dep));
5782 // This handle scope keeps the table handle local to this function, which 5782 Handle<WeakHashTable> table(weak_object_to_code_table(), isolate());
5783 // allows us to safely skip write barriers in table update operations.
5784 HandleScope scope(isolate());
5785 Handle<WeakHashTable> table(WeakHashTable::cast(weak_object_to_code_table_),
5786 isolate());
5787 table = WeakHashTable::Put(table, obj, dep); 5783 table = WeakHashTable::Put(table, obj, dep);
5788 5784 if (*table != weak_object_to_code_table())
5789 if (ShouldZapGarbage() && weak_object_to_code_table_ != *table) { 5785 set_weak_object_to_code_table(*table);
5790 WeakHashTable::cast(weak_object_to_code_table_)->Zap(the_hole_value()); 5786 DCHECK_EQ(*dep, LookupWeakObjectToCodeDependency(obj));
5791 }
5792 set_weak_object_to_code_table(*table);
5793 DCHECK_EQ(*dep, table->Lookup(obj));
5794 } 5787 }
5795 5788
5796 5789
5797 DependentCode* Heap::LookupWeakObjectToCodeDependency(Handle<Object> obj) { 5790 DependentCode* Heap::LookupWeakObjectToCodeDependency(Handle<HeapObject> obj) {
5798 Object* dep = WeakHashTable::cast(weak_object_to_code_table_)->Lookup(obj); 5791 Object* dep = weak_object_to_code_table()->Lookup(obj);
5799 if (dep->IsDependentCode()) return DependentCode::cast(dep); 5792 if (dep->IsDependentCode()) return DependentCode::cast(dep);
5800 return DependentCode::cast(empty_fixed_array()); 5793 return DependentCode::cast(empty_fixed_array());
5801 } 5794 }
5802 5795
5803 5796
5804 void Heap::EnsureWeakObjectToCodeTable() {
5805 if (!weak_object_to_code_table()->IsHashTable()) {
5806 set_weak_object_to_code_table(
5807 *WeakHashTable::New(isolate(), 16, USE_DEFAULT_MINIMUM_CAPACITY,
5808 TENURED));
5809 }
5810 }
5811
5812
5813 void Heap::FatalProcessOutOfMemory(const char* location, bool take_snapshot) { 5797 void Heap::FatalProcessOutOfMemory(const char* location, bool take_snapshot) {
5814 v8::internal::V8::FatalProcessOutOfMemory(location, take_snapshot); 5798 v8::internal::V8::FatalProcessOutOfMemory(location, take_snapshot);
5815 } 5799 }
5816 5800
5817 #ifdef DEBUG 5801 #ifdef DEBUG
5818 5802
5819 class PrintHandleVisitor : public ObjectVisitor { 5803 class PrintHandleVisitor : public ObjectVisitor {
5820 public: 5804 public:
5821 void VisitPointers(Object** start, Object** end) { 5805 void VisitPointers(Object** start, Object** end) {
5822 for (Object** p = start; p < end; p++) 5806 for (Object** p = start; p < end; p++)
(...skipping 764 matching lines...) Expand 10 before | Expand all | Expand 10 after
6587 static_cast<int>(object_sizes_last_time_[index])); 6571 static_cast<int>(object_sizes_last_time_[index]));
6588 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT) 6572 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT)
6589 #undef ADJUST_LAST_TIME_OBJECT_COUNT 6573 #undef ADJUST_LAST_TIME_OBJECT_COUNT
6590 6574
6591 MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_)); 6575 MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_));
6592 MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_)); 6576 MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_));
6593 ClearObjectStats(); 6577 ClearObjectStats();
6594 } 6578 }
6595 } 6579 }
6596 } // namespace v8::internal 6580 } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/heap/heap.h ('k') | src/heap/incremental-marking.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698