Index: src/heap.cc |
diff --git a/src/heap.cc b/src/heap.cc |
index e0b312067fc5c38013c36d76da9f69beae64c4a4..dfe98ec080c38009871c4f2357d532e5ec8d40d1 100644 |
--- a/src/heap.cc |
+++ b/src/heap.cc |
@@ -150,7 +150,7 @@ Heap::Heap() |
#ifdef VERIFY_HEAP |
no_weak_object_verification_scope_depth_(0), |
#endif |
- allocation_sites_scratchpad_length(0), |
+ allocation_sites_scratchpad_length_(0), |
promotion_queue_(this), |
configured_(false), |
external_string_table_(this), |
@@ -516,16 +516,17 @@ void Heap::ProcessPretenuringFeedback() { |
// If the scratchpad overflowed, we have to iterate over the allocation |
// sites list. |
bool use_scratchpad = |
- allocation_sites_scratchpad_length < kAllocationSiteScratchpadSize; |
+ allocation_sites_scratchpad_length_ < kAllocationSiteScratchpadSize; |
int i = 0; |
Object* list_element = allocation_sites_list(); |
bool trigger_deoptimization = false; |
while (use_scratchpad ? |
- i < allocation_sites_scratchpad_length : |
+ i < allocation_sites_scratchpad_length_ : |
list_element->IsAllocationSite()) { |
AllocationSite* site = use_scratchpad ? |
- allocation_sites_scratchpad[i] : AllocationSite::cast(list_element); |
+ AllocationSite::cast(allocation_sites_scratchpad()->get(i)) : |
+ AllocationSite::cast(list_element); |
allocation_mementos_found += site->memento_found_count(); |
if (site->memento_found_count() > 0) { |
active_allocation_sites++; |
@@ -546,7 +547,7 @@ void Heap::ProcessPretenuringFeedback() { |
if (trigger_deoptimization) isolate_->stack_guard()->DeoptMarkedCode(); |
- allocation_sites_scratchpad_length = 0; |
+ FlushAllocationSitesScratchpad(); |
if (FLAG_trace_pretenuring_statistics && |
(allocation_mementos_found > 0 || |
@@ -3300,6 +3301,12 @@ bool Heap::CreateInitialObjects() { |
// Handling of script id generation is in Factory::NewScript. |
set_last_script_id(Smi::FromInt(v8::Script::kNoScriptId)); |
+ { MaybeObject* maybe_obj = AllocateAllocationSitesScratchpad(); |
+ if (!maybe_obj->ToObject(&obj)) return false; |
+ } |
+ set_allocation_sites_scratchpad(FixedArray::cast(obj)); |
+ InitializeAllocationSitesScratchpad(); |
+ |
// Initialize keyed lookup cache. |
isolate_->keyed_lookup_cache()->Clear(); |
@@ -3589,6 +3596,39 @@ MaybeObject* Heap::Uint32ToString(uint32_t value, |
} |
+MaybeObject* Heap::AllocateAllocationSitesScratchpad() { |
+ MaybeObject* maybe_obj = |
+ AllocateFixedArray(kAllocationSiteScratchpadSize, TENURED); |
+ return maybe_obj; |
+} |
+ |
+ |
+void Heap::FlushAllocationSitesScratchpad() { |
+ for (int i = 0; i < allocation_sites_scratchpad_length_; i++) { |
+ allocation_sites_scratchpad()->set_undefined(i); |
+ } |
+ allocation_sites_scratchpad_length_ = 0; |
+} |
+ |
+ |
+void Heap::InitializeAllocationSitesScratchpad() { |
+ ASSERT(allocation_sites_scratchpad()->length() == |
+ kAllocationSiteScratchpadSize); |
+ for (int i = 0; i < kAllocationSiteScratchpadSize; i++) { |
+ allocation_sites_scratchpad()->set_undefined(i); |
+ } |
+} |
+ |
+ |
+void Heap::AddAllocationSiteToScratchpad(AllocationSite* site) { |
+ if (allocation_sites_scratchpad_length_ < kAllocationSiteScratchpadSize) { |
+ allocation_sites_scratchpad()->set( |
+ allocation_sites_scratchpad_length_, site); |
mvstanton
2014/02/06 13:46:37
So both the scratchpad and the AllocationSite are
Hannes Payer (out of office)
2014/02/06 13:51:24
The allocation site may be on an evacuation candid
|
+ allocation_sites_scratchpad_length_++; |
+ } |
+} |
+ |
+ |
Map* Heap::MapForExternalArrayType(ExternalArrayType array_type) { |
return Map::cast(roots_[RootIndexForExternalArrayType(array_type)]); |
} |