| Index: src/runtime.cc
|
| diff --git a/src/runtime.cc b/src/runtime.cc
|
| index b9dc4181c50b0a10d79bf7af43275089dbf0c47b..86749f018a10c89fc4d46e82d71564b8ac651529 100644
|
| --- a/src/runtime.cc
|
| +++ b/src/runtime.cc
|
| @@ -14750,12 +14750,14 @@ static MaybeObject* ArrayConstructorCommon(Isolate* isolate,
|
| Handle<JSFunction> constructor,
|
| Handle<AllocationSite> site,
|
| Arguments* caller_args) {
|
| + Factory* factory = isolate->factory();
|
| +
|
| bool holey = false;
|
| bool can_use_type_feedback = true;
|
| if (caller_args->length() == 1) {
|
| - Object* argument_one = (*caller_args)[0];
|
| + Handle<Object> argument_one = caller_args->at<Object>(0);
|
| if (argument_one->IsSmi()) {
|
| - int value = Smi::cast(argument_one)->value();
|
| + int value = Handle<Smi>::cast(argument_one)->value();
|
| if (value < 0 || value >= JSObject::kInitialMaxFastElementArray) {
|
| // the array is a dictionary in this case.
|
| can_use_type_feedback = false;
|
| @@ -14768,8 +14770,7 @@ static MaybeObject* ArrayConstructorCommon(Isolate* isolate,
|
| }
|
| }
|
|
|
| - JSArray* array;
|
| - MaybeObject* maybe_array;
|
| + Handle<JSArray> array;
|
| if (!site.is_null() && can_use_type_feedback) {
|
| ElementsKind to_kind = site->GetElementsKind();
|
| if (holey && !IsFastHoleyElementsKind(to_kind)) {
|
| @@ -14781,42 +14782,37 @@ static MaybeObject* ArrayConstructorCommon(Isolate* isolate,
|
| // We should allocate with an initial map that reflects the allocation site
|
| // advice. Therefore we use AllocateJSObjectFromMap instead of passing
|
| // the constructor.
|
| - Map* initial_map = constructor->initial_map();
|
| + Handle<Map> initial_map(constructor->initial_map(), isolate);
|
| if (to_kind != initial_map->elements_kind()) {
|
| - MaybeObject* maybe_new_map = initial_map->AsElementsKind(to_kind);
|
| - if (!maybe_new_map->To(&initial_map)) return maybe_new_map;
|
| + initial_map = Map::AsElementsKind(initial_map, to_kind);
|
| + RETURN_IF_EMPTY_HANDLE(isolate, initial_map);
|
| }
|
|
|
| // If we don't care to track arrays of to_kind ElementsKind, then
|
| // don't emit a memento for them.
|
| - AllocationSite* allocation_site =
|
| - (AllocationSite::GetMode(to_kind) == TRACK_ALLOCATION_SITE)
|
| - ? *site
|
| - : NULL;
|
| -
|
| - maybe_array = isolate->heap()->AllocateJSObjectFromMap(initial_map,
|
| - NOT_TENURED,
|
| - true,
|
| - allocation_site);
|
| - if (!maybe_array->To(&array)) return maybe_array;
|
| + Handle<AllocationSite> allocation_site;
|
| + if (AllocationSite::GetMode(to_kind) == TRACK_ALLOCATION_SITE) {
|
| + allocation_site = site;
|
| + }
|
| +
|
| + array = Handle<JSArray>::cast(factory->NewJSObjectFromMap(
|
| + initial_map, NOT_TENURED, true, allocation_site));
|
| } else {
|
| - maybe_array = isolate->heap()->AllocateJSObject(*constructor);
|
| - if (!maybe_array->To(&array)) return maybe_array;
|
| + array = Handle<JSArray>::cast(factory->NewJSObject(constructor));
|
| +
|
| // We might need to transition to holey
|
| ElementsKind kind = constructor->initial_map()->elements_kind();
|
| if (holey && !IsFastHoleyElementsKind(kind)) {
|
| kind = GetHoleyElementsKind(kind);
|
| - maybe_array = array->TransitionElementsKind(kind);
|
| - if (maybe_array->IsFailure()) return maybe_array;
|
| + JSObject::TransitionElementsKind(array, kind);
|
| }
|
| }
|
|
|
| - maybe_array = isolate->heap()->AllocateJSArrayStorage(array, 0, 0,
|
| - DONT_INITIALIZE_ARRAY_ELEMENTS);
|
| - if (maybe_array->IsFailure()) return maybe_array;
|
| + factory->NewJSArrayStorage(array, 0, 0, DONT_INITIALIZE_ARRAY_ELEMENTS);
|
| +
|
| ElementsKind old_kind = array->GetElementsKind();
|
| - maybe_array = ArrayConstructInitializeElements(array, caller_args);
|
| - if (maybe_array->IsFailure()) return maybe_array;
|
| + RETURN_IF_EMPTY_HANDLE(isolate,
|
| + ArrayConstructInitializeElements(array, caller_args));
|
| if (!site.is_null() &&
|
| (old_kind != array->GetElementsKind() ||
|
| !can_use_type_feedback)) {
|
| @@ -14825,7 +14821,7 @@ static MaybeObject* ArrayConstructorCommon(Isolate* isolate,
|
| // We must mark the allocationsite as un-inlinable.
|
| site->SetDoNotInlineCall();
|
| }
|
| - return array;
|
| + return *array;
|
| }
|
|
|
|
|
|
|