Index: src/heap.cc |
diff --git a/src/heap.cc b/src/heap.cc |
index c4cc40ca260aa7f65353cb06a16ccbde55c8bf13..c5571891bad78343d42a7dea7fdf4e7abb3574ed 100644 |
--- a/src/heap.cc |
+++ b/src/heap.cc |
@@ -182,6 +182,7 @@ Heap::Heap() |
memset(roots_, 0, sizeof(roots_[0]) * kRootListLength); |
native_contexts_list_ = NULL; |
array_buffers_list_ = Smi::FromInt(0); |
+ allocation_sites_list_ = Smi::FromInt(0); |
mark_compact_collector_.heap_ = this; |
external_string_table_.heap_ = this; |
// Put a dummy entry in the remembered pages so we can find the list the |
@@ -1664,6 +1665,7 @@ void Heap::ProcessWeakReferences(WeakObjectRetainer* retainer) { |
mark_compact_collector()->is_compacting(); |
ProcessArrayBuffers(retainer, record_slots); |
ProcessNativeContexts(retainer, record_slots); |
+ ProcessAllocationSites(retainer, record_slots); |
} |
void Heap::ProcessNativeContexts(WeakObjectRetainer* retainer, |
@@ -1757,6 +1759,39 @@ void Heap::TearDownArrayBuffers() { |
} |
+template<> |
+struct WeakListVisitor<AllocationSite> { |
+ static void SetWeakNext(AllocationSite* obj, Object* next) { |
+ obj->set_weak_next(next); |
+ } |
+ |
+ static Object* WeakNext(AllocationSite* obj) { |
+ return obj->weak_next(); |
+ } |
+ |
+ static void VisitLiveObject(Heap* heap, |
+ AllocationSite* array_buffer, |
+ WeakObjectRetainer* retainer, |
+ bool record_slots) {} |
+ |
+ static void VisitPhantomObject(Heap* heap, AllocationSite* phantom) {} |
+ |
+ static int WeakNextOffset() { |
+ return AllocationSite::kWeakNextOffset; |
+ } |
+}; |
+ |
+ |
+void Heap::ProcessAllocationSites(WeakObjectRetainer* retainer, |
+ bool record_slots) { |
+ Object* allocation_site_obj = |
+ VisitWeakList<AllocationSite>(this, |
+ allocation_sites_list(), |
+ retainer, record_slots); |
+ set_allocation_sites_list(allocation_site_obj); |
+} |
+ |
+ |
void Heap::VisitExternalResources(v8::ExternalResourceVisitor* visitor) { |
DisallowHeapAllocation no_allocation; |
@@ -2887,7 +2922,12 @@ MaybeObject* Heap::AllocateAllocationSite() { |
MaybeObject* maybe_result = Allocate(allocation_site_map(), |
OLD_POINTER_SPACE); |
if (!maybe_result->ToObject(&result)) return maybe_result; |
- AllocationSite::cast(result)->Initialize(); |
+ AllocationSite* site = AllocationSite::cast(result); |
+ site->Initialize(); |
+ |
+ // Link the site |
+ site->set_weak_next(allocation_sites_list()); |
+ set_allocation_sites_list(site); |
return result; |
} |
@@ -6889,6 +6929,7 @@ bool Heap::CreateHeapObjects() { |
native_contexts_list_ = undefined_value(); |
array_buffers_list_ = undefined_value(); |
+ allocation_sites_list_ = undefined_value(); |
return true; |
} |