Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index 889d2045f162bfa15a49ac9b55c60a436f5ff492..00725597cc61e0b0f14096558bc254fb609e1808 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -8902,21 +8902,6 @@ AllocationSiteInfo* AllocationSiteInfo::FindForJSObject(JSObject* object) { |
} |
-bool AllocationSiteInfo::GetElementsKindPayload(ElementsKind* kind) { |
- ASSERT(kind != NULL); |
- if (payload()->IsJSGlobalPropertyCell()) { |
- JSGlobalPropertyCell* cell = JSGlobalPropertyCell::cast(payload()); |
- Object* cell_contents = cell->value(); |
- if (cell_contents->IsSmi()) { |
- *kind = static_cast<ElementsKind>( |
- Smi::cast(cell_contents)->value()); |
- return true; |
- } |
- } |
- return false; |
-} |
- |
- |
uint32_t StringHasher::MakeArrayIndexHash(uint32_t value, int length) { |
// For array indexes mix the length into the hash as an array index could |
// be zero. |
@@ -10246,7 +10231,11 @@ void Code::ClearTypeFeedbackCells(Heap* heap) { |
TypeFeedbackInfo::cast(raw_info)->type_feedback_cells(); |
for (int i = 0; i < type_feedback_cells->CellCount(); i++) { |
JSGlobalPropertyCell* cell = type_feedback_cells->Cell(i); |
- cell->set_value(TypeFeedbackCells::RawUninitializedSentinel(heap)); |
+ // Don't clear AllocationSites |
+ Object* value = cell->value(); |
+ if (value == NULL || !value->IsAllocationSite()) { |
+ cell->set_value(TypeFeedbackCells::RawUninitializedSentinel(heap)); |
+ } |
} |
} |
} |
@@ -11626,7 +11615,7 @@ MaybeObject* JSObject::SetFastElement(uint32_t index, |
? FAST_HOLEY_DOUBLE_ELEMENTS |
: FAST_DOUBLE_ELEMENTS; |
- MaybeObject* maybe_failure = UpdateAllocationSiteInfo(to_kind); |
+ MaybeObject* maybe_failure = UpdateAllocationSite(to_kind); |
if (maybe_failure->IsFailure()) return maybe_failure; |
MaybeObject* maybe = |
@@ -11643,7 +11632,7 @@ MaybeObject* JSObject::SetFastElement(uint32_t index, |
? FAST_HOLEY_ELEMENTS |
: FAST_ELEMENTS; |
- MaybeObject* maybe_failure = UpdateAllocationSiteInfo(kind); |
+ MaybeObject* maybe_failure = UpdateAllocationSite(kind); |
if (maybe_failure->IsFailure()) return maybe_failure; |
MaybeObject* maybe_new_map = GetElementsTransitionMap(GetIsolate(), |
@@ -12206,7 +12195,7 @@ Handle<Object> JSObject::TransitionElementsKind(Handle<JSObject> object, |
} |
-MaybeObject* JSObject::UpdateAllocationSiteInfo(ElementsKind to_kind) { |
+MaybeObject* JSObject::UpdateAllocationSite(ElementsKind to_kind) { |
if (!FLAG_track_allocation_sites || !IsJSArray()) { |
return this; |
} |
@@ -12216,18 +12205,20 @@ MaybeObject* JSObject::UpdateAllocationSiteInfo(ElementsKind to_kind) { |
return this; |
} |
- if (info->payload()->IsJSArray()) { |
- JSArray* payload = JSArray::cast(info->payload()); |
+ // Walk through to the Allocation Site |
+ AllocationSite* site = AllocationSite::cast(info->payload()); |
+ if (site->IsLiteralSite()) { |
+ JSArray* payload = JSArray::cast(site->payload()); |
ElementsKind kind = payload->GetElementsKind(); |
- if (AllocationSiteInfo::GetMode(kind, to_kind) == TRACK_ALLOCATION_SITE) { |
+ if (AllocationSite::GetMode(kind, to_kind) == TRACK_ALLOCATION_SITE) { |
// If the array is huge, it's not likely to be defined in a local |
// function, so we shouldn't make new instances of it very often. |
uint32_t length = 0; |
CHECK(payload->length()->ToArrayIndex(&length)); |
- if (length <= AllocationSiteInfo::kMaximumArrayBytesToPretransition) { |
+ if (length <= AllocationSite::kMaximumArrayBytesToPretransition) { |
if (FLAG_trace_track_allocation_sites) { |
PrintF( |
- "AllocationSiteInfo: JSArray %p boilerplate updated %s->%s\n", |
+ "AllocationSite: JSArray %p boilerplate updated %s->%s\n", |
reinterpret_cast<void*>(this), |
ElementsKindToString(kind), |
ElementsKindToString(to_kind)); |
@@ -12235,21 +12226,16 @@ MaybeObject* JSObject::UpdateAllocationSiteInfo(ElementsKind to_kind) { |
return payload->TransitionElementsKind(to_kind); |
} |
} |
- } else if (info->payload()->IsJSGlobalPropertyCell()) { |
- JSGlobalPropertyCell* cell = JSGlobalPropertyCell::cast(info->payload()); |
- Object* cell_contents = cell->value(); |
- if (cell_contents->IsSmi()) { |
- ElementsKind kind = static_cast<ElementsKind>( |
- Smi::cast(cell_contents)->value()); |
- if (AllocationSiteInfo::GetMode(kind, to_kind) == TRACK_ALLOCATION_SITE) { |
- if (FLAG_trace_track_allocation_sites) { |
- PrintF("AllocationSiteInfo: JSArray %p info updated %s->%s\n", |
- reinterpret_cast<void*>(this), |
- ElementsKindToString(kind), |
- ElementsKindToString(to_kind)); |
- } |
- cell->set_value(Smi::FromInt(to_kind)); |
+ } else { |
+ ElementsKind kind = site->GetElementsKindPayload(); |
+ if (AllocationSite::GetMode(kind, to_kind) == TRACK_ALLOCATION_SITE) { |
+ if (FLAG_trace_track_allocation_sites) { |
+ PrintF("AllocationSite: JSArray %p site updated %s->%s\n", |
+ reinterpret_cast<void*>(this), |
+ ElementsKindToString(kind), |
+ ElementsKindToString(to_kind)); |
} |
+ site->set_payload(Smi::FromInt(to_kind)); |
} |
} |
return this; |
@@ -12266,7 +12252,7 @@ MaybeObject* JSObject::TransitionElementsKind(ElementsKind to_kind) { |
if (from_kind == to_kind) return this; |
- MaybeObject* maybe_failure = UpdateAllocationSiteInfo(to_kind); |
+ MaybeObject* maybe_failure = UpdateAllocationSite(to_kind); |
if (maybe_failure->IsFailure()) return maybe_failure; |
Isolate* isolate = GetIsolate(); |