Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(45)

Unified Diff: src/builtins.cc

Issue 11818021: Allocation Info Tracking, continued. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Review feedback Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/arm/macro-assembler-arm.cc ('k') | src/elements.cc » ('j') | src/heap.cc » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/builtins.cc
diff --git a/src/builtins.cc b/src/builtins.cc
index de006c17b74bf517f409aa5336ce8191b38b2c6e..15ea202ae938de91c5f1ade0b6e1d3b804c17b84 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,23 +211,20 @@ 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);
- } else {
- AllocationSiteMode mode = AllocationSiteInfo::GetMode(kind);
- maybe_array = isolate->heap()->AllocateEmptyJSArray(kind,
- mode,
- &type_info);
- }
+ AllocationSiteMode mode = AllocationSiteInfo::GetMode(to_kind);
+ maybe_array = isolate->heap()->AllocateEmptyJSArray(kind,
+ mode,
+ &type_info);
if (!maybe_array->To(&array)) return maybe_array;
}
}
@@ -265,8 +252,9 @@ 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());
+ MaybeObject* maybe_array = array->Initialize(0);
+ if (maybe_array->IsFailure()) return maybe_array;
+
AllocationSiteInfo* info = AllocationSiteInfo::FindForJSObject(array);
ElementsKind to_kind = array->GetElementsKind();
if (info != NULL && info->GetElementsKindPayload(&to_kind)) {
@@ -280,8 +268,7 @@ static MaybeObject* ArrayCodeGenericCommon(Arguments* args,
ElementsKindToString(to_kind));
}
- MaybeObject* maybe_array =
- array->TransitionElementsKind(to_kind);
+ maybe_array = array->TransitionElementsKind(to_kind);
if (maybe_array->IsFailure()) return maybe_array;
}
}
@@ -298,8 +285,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,10 +292,9 @@ 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;
- }
+ MaybeObject* maybe_obj = ArrayConstructInitializeElements(array,
+ &adjusted_arguments);
+ if (!maybe_obj->To(&array)) return maybe_obj;
return array;
}
« no previous file with comments | « src/arm/macro-assembler-arm.cc ('k') | src/elements.cc » ('j') | src/heap.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698