Index: src/crankshaft/hydrogen.cc |
diff --git a/src/crankshaft/hydrogen.cc b/src/crankshaft/hydrogen.cc |
index 38a9fd0ad88425776d69b9485ac0ea852c81d91d..40a364c6c9aae0a86ac6dd8da6e28f9358ea1cd1 100644 |
--- a/src/crankshaft/hydrogen.cc |
+++ b/src/crankshaft/hydrogen.cc |
@@ -5990,59 +5990,34 @@ void HOptimizedGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) { |
Handle<AllocationSite> site; |
Handle<LiteralsArray> literals(environment()->closure()->literals(), |
isolate()); |
- bool uninitialized = false; |
Handle<Object> literals_cell(literals->literal(expr->literal_index()), |
isolate()); |
Handle<JSObject> boilerplate_object; |
- if (literals_cell->IsUndefined()) { |
- uninitialized = true; |
- Handle<Object> raw_boilerplate; |
- ASSIGN_RETURN_ON_EXCEPTION_VALUE( |
- isolate(), raw_boilerplate, |
- Runtime::CreateArrayLiteralBoilerplate(isolate(), literals, |
- expr->constant_elements()), |
- Bailout(kArrayBoilerplateCreationFailed)); |
- |
- boilerplate_object = Handle<JSObject>::cast(raw_boilerplate); |
- AllocationSiteCreationContext creation_context(isolate()); |
- site = creation_context.EnterNewScope(); |
- if (JSObject::DeepWalk(boilerplate_object, &creation_context).is_null()) { |
- return Bailout(kArrayBoilerplateCreationFailed); |
- } |
- creation_context.ExitScope(site, boilerplate_object); |
- literals->set_literal(expr->literal_index(), *site); |
- |
- if (boilerplate_object->elements()->map() == |
- isolate()->heap()->fixed_cow_array_map()) { |
- isolate()->counters()->cow_arrays_created_runtime()->Increment(); |
- } |
- } else { |
+ if (!literals_cell->IsUndefined()) { |
DCHECK(literals_cell->IsAllocationSite()); |
site = Handle<AllocationSite>::cast(literals_cell); |
boilerplate_object = Handle<JSObject>( |
JSObject::cast(site->transition_info()), isolate()); |
} |
- DCHECK(!boilerplate_object.is_null()); |
- DCHECK(site->SitePointsToLiteral()); |
- |
- ElementsKind boilerplate_elements_kind = |
- boilerplate_object->GetElementsKind(); |
+ ElementsKind boilerplate_elements_kind = expr->constant_elements_kind(); |
+ if (!boilerplate_object.is_null()) { |
+ boilerplate_elements_kind = boilerplate_object->GetElementsKind(); |
+ } |
// Check whether to use fast or slow deep-copying for boilerplate. |
int max_properties = kMaxFastLiteralProperties; |
- if (IsFastLiteral(boilerplate_object, |
- kMaxFastLiteralDepth, |
+ if (!boilerplate_object.is_null() && |
+ IsFastLiteral(boilerplate_object, kMaxFastLiteralDepth, |
&max_properties)) { |
+ DCHECK(site->SitePointsToLiteral()); |
AllocationSiteUsageContext site_context(isolate(), site, false); |
site_context.EnterNewScope(); |
literal = BuildFastLiteral(boilerplate_object, &site_context); |
site_context.ExitScope(site, boilerplate_object); |
} else { |
NoObservableSideEffectsScope no_effects(this); |
- // Boilerplate already exists and constant elements are never accessed, |
- // pass an empty fixed array to the runtime function instead. |
- Handle<FixedArray> constants = isolate()->factory()->empty_fixed_array(); |
+ Handle<FixedArray> constants = expr->constant_elements(); |
int literal_index = expr->literal_index(); |
int flags = expr->ComputeFlags(true); |
@@ -6053,7 +6028,9 @@ void HOptimizedGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) { |
literal = Add<HCallRuntime>(Runtime::FunctionForId(function_id), 4); |
// Register to deopt if the boilerplate ElementsKind changes. |
- top_info()->dependencies()->AssumeTransitionStable(site); |
+ if (!site.is_null()) { |
+ top_info()->dependencies()->AssumeTransitionStable(site); |
+ } |
} |
// The array is expected in the bailout environment during computation |
@@ -6085,9 +6062,8 @@ void HOptimizedGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) { |
case FAST_HOLEY_ELEMENTS: |
case FAST_DOUBLE_ELEMENTS: |
case FAST_HOLEY_DOUBLE_ELEMENTS: { |
- HStoreKeyed* instr = Add<HStoreKeyed>(elements, key, value, nullptr, |
- boilerplate_elements_kind); |
- instr->SetUninitialized(uninitialized); |
+ Add<HStoreKeyed>(elements, key, value, nullptr, |
+ boilerplate_elements_kind); |
break; |
} |
default: |