| Index: src/runtime.cc
|
| diff --git a/src/runtime.cc b/src/runtime.cc
|
| index e8d6ea927c83c632b76cf34d07e5ee30a86e2bae..443d32cbcb48b81f65060057f3c7cd1a492c593a 100644
|
| --- a/src/runtime.cc
|
| +++ b/src/runtime.cc
|
| @@ -508,15 +508,23 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateArrayLiteral) {
|
| CONVERT_ARG_HANDLE_CHECKED(FixedArray, elements, 2);
|
|
|
| // Check if boilerplate exists. If not, create it first.
|
| - Handle<Object> boilerplate(literals->get(literals_index), isolate);
|
| - if (*boilerplate == isolate->heap()->undefined_value()) {
|
| + Handle<Object> literal_site(literals->get(literals_index), isolate);
|
| + Handle<AllocationSite> site;
|
| + Handle<Object> boilerplate;
|
| + if (*literal_site == isolate->heap()->undefined_value()) {
|
| ASSERT(*elements != isolate->heap()->empty_fixed_array());
|
| boilerplate =
|
| Runtime::CreateArrayLiteralBoilerplate(isolate, literals, elements);
|
| if (boilerplate.is_null()) return Failure::Exception();
|
| + site = isolate->factory()->NewAllocationSite();
|
| + site->set_payload(*boilerplate);
|
| // Update the functions literal and return the boilerplate.
|
| - literals->set(literals_index, *boilerplate);
|
| + literals->set(literals_index, *site);
|
| + } else {
|
| + site = Handle<AllocationSite>::cast(literal_site);
|
| + boilerplate = Handle<Object>(site->payload(), isolate);
|
| }
|
| +
|
| return JSObject::cast(*boilerplate)->DeepCopy(isolate);
|
| }
|
|
|
| @@ -529,25 +537,34 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateArrayLiteralShallow) {
|
| CONVERT_ARG_HANDLE_CHECKED(FixedArray, elements, 2);
|
|
|
| // Check if boilerplate exists. If not, create it first.
|
| - Handle<Object> boilerplate(literals->get(literals_index), isolate);
|
| - if (*boilerplate == isolate->heap()->undefined_value()) {
|
| + Handle<Object> literal_site(literals->get(literals_index), isolate);
|
| + Handle<AllocationSite> site;
|
| + Handle<Object> boilerplate;
|
| + if (*literal_site == isolate->heap()->undefined_value()) {
|
| ASSERT(*elements != isolate->heap()->empty_fixed_array());
|
| boilerplate =
|
| Runtime::CreateArrayLiteralBoilerplate(isolate, literals, elements);
|
| if (boilerplate.is_null()) return Failure::Exception();
|
| + site = isolate->factory()->NewAllocationSite();
|
| + site->set_payload(*boilerplate);
|
| // Update the functions literal and return the boilerplate.
|
| - literals->set(literals_index, *boilerplate);
|
| + literals->set(literals_index, *site);
|
| + } else {
|
| + site = Handle<AllocationSite>::cast(literal_site);
|
| + boilerplate = Handle<Object>(site->payload(), isolate);
|
| }
|
| +
|
| if (JSObject::cast(*boilerplate)->elements()->map() ==
|
| isolate->heap()->fixed_cow_array_map()) {
|
| isolate->counters()->cow_arrays_created_runtime()->Increment();
|
| }
|
|
|
| JSObject* boilerplate_object = JSObject::cast(*boilerplate);
|
| - AllocationSiteMode mode = AllocationSiteInfo::GetMode(
|
| + AllocationSiteMode mode = AllocationSite::GetMode(
|
| boilerplate_object->GetElementsKind());
|
| if (mode == TRACK_ALLOCATION_SITE) {
|
| - return isolate->heap()->CopyJSObjectWithAllocationSite(boilerplate_object);
|
| + return isolate->heap()->CopyJSObjectWithAllocationSite(
|
| + boilerplate_object, *site);
|
| }
|
|
|
| return isolate->heap()->CopyJSObject(boilerplate_object);
|
| @@ -4977,8 +4994,15 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_StoreArrayLiteralElement) {
|
| CONVERT_ARG_HANDLE_CHECKED(FixedArray, literals, 3);
|
| CONVERT_SMI_ARG_CHECKED(literal_index, 4);
|
|
|
| - Object* raw_boilerplate_object = literals->get(literal_index);
|
| - Handle<JSArray> boilerplate_object(JSArray::cast(raw_boilerplate_object));
|
| + Object* raw_literal_cell = literals->get(literal_index);
|
| + JSArray* boilerplate = NULL;
|
| + if (raw_literal_cell->IsAllocationSite()) {
|
| + AllocationSite* site = AllocationSite::cast(raw_literal_cell);
|
| + boilerplate = JSArray::cast(site->payload());
|
| + } else {
|
| + boilerplate = JSArray::cast(raw_literal_cell);
|
| + }
|
| + Handle<JSArray> boilerplate_object(boilerplate);
|
| ElementsKind elements_kind = object->GetElementsKind();
|
| ASSERT(IsFastElementsKind(elements_kind));
|
| // Smis should never trigger transitions.
|
| @@ -13475,19 +13499,19 @@ static MaybeObject* ArrayConstructorCommon(Isolate* isolate,
|
| MaybeObject* maybe_array;
|
| if (!type_info.is_null() &&
|
| *type_info != isolate->heap()->undefined_value() &&
|
| - JSGlobalPropertyCell::cast(*type_info)->value()->IsSmi() &&
|
| + AllocationSite::cast(*type_info)->payload()->IsSmi() &&
|
| can_use_type_feedback) {
|
| - JSGlobalPropertyCell* cell = JSGlobalPropertyCell::cast(*type_info);
|
| - Smi* smi = Smi::cast(cell->value());
|
| - ElementsKind to_kind = static_cast<ElementsKind>(smi->value());
|
| + Handle<AllocationSite> site = Handle<AllocationSite>::cast(type_info);
|
| + ASSERT(!site->IsLiteralSite());
|
| + ElementsKind to_kind = site->GetElementsKindPayload();
|
| 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));
|
| + site->SetElementsKindPayload(to_kind);
|
| }
|
|
|
| maybe_array = isolate->heap()->AllocateJSObjectWithAllocationSite(
|
| - *constructor, type_info);
|
| + *constructor, site);
|
| if (!maybe_array->To(&array)) return maybe_array;
|
| } else {
|
| maybe_array = isolate->heap()->AllocateJSObject(*constructor);
|
|
|