| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index 8147106aaab168b8bbfa825f92ee5c310ace1359..8816f9a34526f27edcb3b91042b33c928e7f2e25 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -8865,21 +8865,6 @@ AllocationSiteInfo* AllocationSiteInfo::FindForJSObject(JSObject* object) {
|
| }
|
|
|
|
|
| -bool AllocationSiteInfo::GetElementsKindPayload(ElementsKind* kind) {
|
| - ASSERT(kind != NULL);
|
| - if (payload()->IsCell()) {
|
| - Cell* cell = Cell::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.
|
| @@ -10270,7 +10255,11 @@ void Code::ClearTypeFeedbackCells(Heap* heap) {
|
| TypeFeedbackInfo::cast(raw_info)->type_feedback_cells();
|
| for (int i = 0; i < type_feedback_cells->CellCount(); i++) {
|
| Cell* cell = type_feedback_cells->GetCell(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));
|
| + }
|
| }
|
| }
|
| }
|
| @@ -11735,7 +11724,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 =
|
| @@ -11752,7 +11741,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(),
|
| @@ -12315,28 +12304,30 @@ 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;
|
| }
|
|
|
| AllocationSiteInfo* info = AllocationSiteInfo::FindForJSObject(this);
|
| - if (info == NULL) {
|
| + if (info == NULL || !info->IsValid()) {
|
| return this;
|
| }
|
|
|
| - if (info->payload()->IsJSArray()) {
|
| - JSArray* payload = JSArray::cast(info->payload());
|
| + // Walk through to the Allocation Site
|
| + AllocationSite* site = info->GetAllocationSite();
|
| + 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));
|
| @@ -12344,21 +12335,16 @@ MaybeObject* JSObject::UpdateAllocationSiteInfo(ElementsKind to_kind) {
|
| return payload->TransitionElementsKind(to_kind);
|
| }
|
| }
|
| - } else if (info->payload()->IsCell()) {
|
| - Cell* cell = Cell::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;
|
| @@ -12375,7 +12361,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();
|
|
|