| OLD | NEW |
| 1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 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/api.h" | 7 #include "src/api.h" |
| 8 #include "src/global-handles.h" | 8 #include "src/global-handles.h" |
| 9 | 9 |
| 10 #include "src/vm-state-inl.h" | 10 #include "src/vm-state-inl.h" |
| (...skipping 838 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 849 } | 849 } |
| 850 | 850 |
| 851 | 851 |
| 852 int GlobalHandles::PostGarbageCollectionProcessing(GarbageCollector collector) { | 852 int GlobalHandles::PostGarbageCollectionProcessing(GarbageCollector collector) { |
| 853 // Process weak global handle callbacks. This must be done after the | 853 // Process weak global handle callbacks. This must be done after the |
| 854 // GC is completely done, because the callbacks may invoke arbitrary | 854 // GC is completely done, because the callbacks may invoke arbitrary |
| 855 // API functions. | 855 // API functions. |
| 856 DCHECK(isolate_->heap()->gc_state() == Heap::NOT_IN_GC); | 856 DCHECK(isolate_->heap()->gc_state() == Heap::NOT_IN_GC); |
| 857 const int initial_post_gc_processing_count = ++post_gc_processing_count_; | 857 const int initial_post_gc_processing_count = ++post_gc_processing_count_; |
| 858 int freed_nodes = 0; | 858 int freed_nodes = 0; |
| 859 freed_nodes += DispatchPendingPhantomCallbacks(); |
| 860 if (initial_post_gc_processing_count != post_gc_processing_count_) { |
| 861 // If the callbacks caused a nested GC, then return. See comment in |
| 862 // PostScavengeProcessing. |
| 863 return freed_nodes; |
| 864 } |
| 859 if (collector == SCAVENGER) { | 865 if (collector == SCAVENGER) { |
| 860 freed_nodes = PostScavengeProcessing(initial_post_gc_processing_count); | 866 freed_nodes = PostScavengeProcessing(initial_post_gc_processing_count); |
| 861 } else { | 867 } else { |
| 862 freed_nodes = PostMarkSweepProcessing(initial_post_gc_processing_count); | 868 freed_nodes = PostMarkSweepProcessing(initial_post_gc_processing_count); |
| 863 } | 869 } |
| 864 if (initial_post_gc_processing_count != post_gc_processing_count_) { | 870 if (initial_post_gc_processing_count != post_gc_processing_count_) { |
| 865 // If the callbacks caused a nested GC, then return. See comment in | 871 // If the callbacks caused a nested GC, then return. See comment in |
| 866 // PostScavengeProcessing. | 872 // PostScavengeProcessing. |
| 867 return freed_nodes; | 873 return freed_nodes; |
| 868 } | 874 } |
| 869 freed_nodes += DispatchPendingPhantomCallbacks(); | |
| 870 if (initial_post_gc_processing_count == post_gc_processing_count_) { | 875 if (initial_post_gc_processing_count == post_gc_processing_count_) { |
| 871 UpdateListOfNewSpaceNodes(); | 876 UpdateListOfNewSpaceNodes(); |
| 872 } | 877 } |
| 873 return freed_nodes; | 878 return freed_nodes; |
| 874 } | 879 } |
| 875 | 880 |
| 876 | 881 |
| 877 void GlobalHandles::PendingPhantomCallback::invoke() { | 882 void GlobalHandles::PendingPhantomCallback::invoke() { |
| 878 if (node_->state() == Node::FREE) return; | 883 if (node_->state() == Node::FREE) return; |
| 879 DCHECK(node_->state() == Node::NEAR_DEATH); | 884 DCHECK(node_->state() == Node::NEAR_DEATH); |
| (...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1239 DCHECK_EQ(isolate->heap()->the_hole_value(), blocks_[block][offset]); | 1244 DCHECK_EQ(isolate->heap()->the_hole_value(), blocks_[block][offset]); |
| 1240 blocks_[block][offset] = object; | 1245 blocks_[block][offset] = object; |
| 1241 if (isolate->heap()->InNewSpace(object)) { | 1246 if (isolate->heap()->InNewSpace(object)) { |
| 1242 new_space_indices_.Add(size_); | 1247 new_space_indices_.Add(size_); |
| 1243 } | 1248 } |
| 1244 *index = size_++; | 1249 *index = size_++; |
| 1245 } | 1250 } |
| 1246 | 1251 |
| 1247 | 1252 |
| 1248 } } // namespace v8::internal | 1253 } } // namespace v8::internal |
| OLD | NEW |