| Index: src/heap.cc
|
| ===================================================================
|
| --- src/heap.cc (revision 13465)
|
| +++ src/heap.cc (working copy)
|
| @@ -128,8 +128,6 @@
|
| old_gen_exhausted_(false),
|
| store_buffer_rebuilder_(store_buffer()),
|
| hidden_symbol_(NULL),
|
| - global_gc_prologue_callback_(NULL),
|
| - global_gc_epilogue_callback_(NULL),
|
| gc_safe_size_of_old_object_(NULL),
|
| total_regexp_code_generated_(0),
|
| tracer_(NULL),
|
| @@ -882,24 +880,13 @@
|
| }
|
| #endif
|
|
|
| - if (collector == MARK_COMPACTOR && global_gc_prologue_callback_) {
|
| - ASSERT(!allocation_allowed_);
|
| - GCTracer::Scope scope(tracer, GCTracer::Scope::EXTERNAL);
|
| - VMState state(isolate_, EXTERNAL);
|
| - global_gc_prologue_callback_();
|
| - }
|
| -
|
| GCType gc_type =
|
| collector == MARK_COMPACTOR ? kGCTypeMarkSweepCompact : kGCTypeScavenge;
|
|
|
| {
|
| GCTracer::Scope scope(tracer, GCTracer::Scope::EXTERNAL);
|
| VMState state(isolate_, EXTERNAL);
|
| - for (int i = 0; i < gc_prologue_callbacks_.length(); ++i) {
|
| - if (gc_type & gc_prologue_callbacks_[i].gc_type) {
|
| - gc_prologue_callbacks_[i].callback(gc_type, kNoGCCallbackFlags);
|
| - }
|
| - }
|
| + CallGCPrologueCallbacks(gc_type);
|
| }
|
|
|
| EnsureFromSpaceIsCommitted();
|
| @@ -1009,21 +996,9 @@
|
| {
|
| GCTracer::Scope scope(tracer, GCTracer::Scope::EXTERNAL);
|
| VMState state(isolate_, EXTERNAL);
|
| - GCCallbackFlags callback_flags = kNoGCCallbackFlags;
|
| - for (int i = 0; i < gc_epilogue_callbacks_.length(); ++i) {
|
| - if (gc_type & gc_epilogue_callbacks_[i].gc_type) {
|
| - gc_epilogue_callbacks_[i].callback(gc_type, callback_flags);
|
| - }
|
| - }
|
| + CallGCEpilogueCallbacks(gc_type);
|
| }
|
|
|
| - if (collector == MARK_COMPACTOR && global_gc_epilogue_callback_) {
|
| - ASSERT(!allocation_allowed_);
|
| - GCTracer::Scope scope(tracer, GCTracer::Scope::EXTERNAL);
|
| - VMState state(isolate_, EXTERNAL);
|
| - global_gc_epilogue_callback_();
|
| - }
|
| -
|
| #ifdef VERIFY_HEAP
|
| if (FLAG_verify_heap) {
|
| VerifySymbolTable();
|
| @@ -1034,6 +1009,24 @@
|
| }
|
|
|
|
|
| +void Heap::CallGCPrologueCallbacks(GCType gc_type) {
|
| + for (int i = 0; i < gc_prologue_callbacks_.length(); ++i) {
|
| + if (gc_type & gc_prologue_callbacks_[i].gc_type) {
|
| + gc_prologue_callbacks_[i].callback(gc_type, kNoGCCallbackFlags);
|
| + }
|
| + }
|
| +}
|
| +
|
| +
|
| +void Heap::CallGCEpilogueCallbacks(GCType gc_type) {
|
| + for (int i = 0; i < gc_epilogue_callbacks_.length(); ++i) {
|
| + if (gc_type & gc_epilogue_callbacks_[i].gc_type) {
|
| + gc_epilogue_callbacks_[i].callback(gc_type, kNoGCCallbackFlags);
|
| + }
|
| + }
|
| +}
|
| +
|
| +
|
| void Heap::MarkCompact(GCTracer* tracer) {
|
| gc_state_ = MARK_COMPACT;
|
| LOG(isolate_, ResourceEvent("markcompact", "begin"));
|
| @@ -1376,6 +1369,7 @@
|
| new_space_front = DoScavenge(&scavenge_visitor, new_space_front);
|
| }
|
| isolate()->global_handles()->RemoveObjectGroups();
|
| + isolate()->global_handles()->RemoveImplicitRefGroups();
|
|
|
| isolate_->global_handles()->IdentifyNewSpaceWeakIndependentHandles(
|
| &IsUnscavengedHeapObject);
|
|
|