Index: src/builtins.cc |
diff --git a/src/builtins.cc b/src/builtins.cc |
index 87a47462818b423b5b94bf6081c4b748d14c6c73..aa6920375b1a015d5a15e9ebea7f62719da599cb 100644 |
--- a/src/builtins.cc |
+++ b/src/builtins.cc |
@@ -203,17 +203,7 @@ RUNTIME_FUNCTION(MaybeObject*, ArrayConstructor_StubFailure) { |
holey = (value > 0 && value < JSObject::kInitialMaxFastElementArray); |
} |
- // Allocate the initial map if absent. |
- if (!function->has_initial_map()) { |
- Object* initial_map; |
- { MaybeObject* maybe_initial_map = |
- isolate->heap()->AllocateInitialMap(*function); |
- if (!maybe_initial_map->ToObject(&initial_map)) return maybe_initial_map; |
- } |
- function->set_initial_map(Map::cast(initial_map)); |
- Map::cast(initial_map)->set_constructor(*function); |
- } |
- |
+ ASSERT(function->has_initial_map()); |
ElementsKind kind = function->initial_map()->elements_kind(); |
if (holey) { |
kind = GetHoleyElementsKind(kind); |
@@ -221,22 +211,22 @@ RUNTIME_FUNCTION(MaybeObject*, ArrayConstructor_StubFailure) { |
MaybeObject* maybe_array; |
if (*type_info != isolate->heap()->undefined_value()) { |
- ASSERT(type_info->IsJSGlobalPropertyCell()); |
JSGlobalPropertyCell* cell = JSGlobalPropertyCell::cast(*type_info); |
if (cell->value()->IsSmi()) { |
Smi* smi = Smi::cast(cell->value()); |
ElementsKind to_kind = static_cast<ElementsKind>(smi->value()); |
- if (holey) { |
+ if (holey && !IsFastHoleyElementsKind(to_kind)) { |
to_kind = GetHoleyElementsKind(to_kind); |
+ // Update the allocation site info to reflect the advice alteration. |
+ cell->set_value(Smi::FromInt(to_kind)); |
} |
- if (IsMoreGeneralElementsKindTransition(kind, to_kind)) { |
- maybe_array = isolate->heap()->AllocateEmptyJSArray(to_kind); |
+ AllocationSiteMode mode = AllocationSiteInfo::GetMode(to_kind); |
+ if (mode == TRACK_ALLOCATION_SITE) { |
+ maybe_array = isolate->heap()->AllocateEmptyJSArrayWithAllocationSite( |
+ kind, type_info); |
} else { |
- AllocationSiteMode mode = AllocationSiteInfo::GetMode(kind); |
- maybe_array = isolate->heap()->AllocateEmptyJSArray(kind, |
- mode, |
- &type_info); |
+ maybe_array = isolate->heap()->AllocateEmptyJSArray(kind); |
} |
if (!maybe_array->To(&array)) return maybe_array; |
} |
@@ -265,24 +255,26 @@ static MaybeObject* ArrayCodeGenericCommon(Arguments* args, |
array = JSArray::cast((*args)[0]); |
// Initialize elements and length in case later allocations fail so that the |
// array object is initialized in a valid state. |
- array->set_length(Smi::FromInt(0)); |
- array->set_elements(heap->empty_fixed_array()); |
- AllocationSiteInfo* info = AllocationSiteInfo::FindForJSObject(array); |
- ElementsKind to_kind = array->GetElementsKind(); |
- if (info != NULL && info->GetElementsKindPayload(&to_kind)) { |
- if (IsMoreGeneralElementsKindTransition(array->GetElementsKind(), |
- to_kind)) { |
- // We have advice that we should change the elements kind |
- if (FLAG_trace_track_allocation_sites) { |
- PrintF("AllocationSiteInfo: pre-transitioning array %p(%s->%s)\n", |
- reinterpret_cast<void*>(array), |
- ElementsKindToString(array->GetElementsKind()), |
- ElementsKindToString(to_kind)); |
- } |
+ MaybeObject* maybe_array = array->Initialize(0); |
+ if (maybe_array->IsFailure()) return maybe_array; |
- MaybeObject* maybe_array = |
- array->TransitionElementsKind(to_kind); |
- if (maybe_array->IsFailure()) return maybe_array; |
+ if (FLAG_optimize_constructed_arrays) { |
+ AllocationSiteInfo* info = AllocationSiteInfo::FindForJSObject(array); |
+ ElementsKind to_kind = array->GetElementsKind(); |
+ if (info != NULL && info->GetElementsKindPayload(&to_kind)) { |
+ if (IsMoreGeneralElementsKindTransition(array->GetElementsKind(), |
+ to_kind)) { |
+ // We have advice that we should change the elements kind |
+ if (FLAG_trace_track_allocation_sites) { |
+ PrintF("AllocationSiteInfo: pre-transitioning array %p(%s->%s)\n", |
+ reinterpret_cast<void*>(array), |
+ ElementsKindToString(array->GetElementsKind()), |
+ ElementsKindToString(to_kind)); |
+ } |
+ |
+ maybe_array = array->TransitionElementsKind(to_kind); |
+ if (maybe_array->IsFailure()) return maybe_array; |
+ } |
} |
} |
@@ -298,8 +290,6 @@ static MaybeObject* ArrayCodeGenericCommon(Arguments* args, |
} |
} else { |
// Allocate the JS Array |
- // TODO(mvstanton): There is no allocation info advice for this case. |
- // How to address? |
MaybeObject* maybe_obj = heap->AllocateJSObject(constructor); |
if (!maybe_obj->To(&array)) return maybe_obj; |
} |
@@ -307,12 +297,7 @@ static MaybeObject* ArrayCodeGenericCommon(Arguments* args, |
Arguments adjusted_arguments(args->length() - 1, args->arguments() - 1); |
ASSERT(adjusted_arguments.length() < 1 || |
adjusted_arguments[0] == (*args)[1]); |
- { MaybeObject* maybe_obj = ArrayConstructInitializeElements(array, |
- &adjusted_arguments); |
- if (!maybe_obj->To(&array)) return maybe_obj; |
- } |
- |
- return array; |
+ return ArrayConstructInitializeElements(array, &adjusted_arguments); |
} |
@@ -1183,8 +1168,6 @@ BUILTIN(ArrayConcat) { |
heap->AllocateJSArrayAndStorage(elements_kind, |
result_len, |
result_len, |
- DONT_TRACK_ALLOCATION_SITE, |
- NULL, |
mode); |
if (!maybe_array->To(&result_array)) return maybe_array; |
if (result_len == 0) return result_array; |