Chromium Code Reviews| Index: src/hydrogen.cc |
| diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
| index 82f1e377be41160caa2c6902a41a35384f2e4ebc..b0fb188d208943eeed8ed7d73a7ddda37914c8e9 100644 |
| --- a/src/hydrogen.cc |
| +++ b/src/hydrogen.cc |
| @@ -6906,14 +6906,46 @@ void HOptimizedGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) { |
| pointer_size, |
| mode); |
| } 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(); |
|
ulan
2013/05/10 08:38:31
Space before =
|
| + int literal_index = expr->literal_index(); |
| + |
| + // TODO(mstarzinger): The following check and deopt is actually obsolete |
| + // but test cases for the tick processor fails because profile differs. |
| + |
| + // Deopt if the array literal boilerplate ElementsKind is of a type |
| + // different than the expected one. The check isn't necessary if the |
| + // boilerplate has already been converted to TERMINAL_FAST_ELEMENTS_KIND. |
| + if (CanTransitionToMoreGeneralFastElementsKind( |
| + boilerplate_elements_kind, true)) { |
| + IfBuilder builder(this); |
| + HValue* boilerplate = AddInstruction(new(zone()) |
| + HConstant(original_boilerplate_object, Representation::Tagged())); |
| + HValue* elements_kind = AddInstruction(new(zone()) |
| + HElementsKind(boilerplate)); |
| + HValue* expected_kind = AddInstruction(new(zone()) |
| + HConstant(boilerplate_elements_kind, Representation::Integer32())); |
| + builder.IfCompare(elements_kind, expected_kind, Token::EQ); |
| + builder.Then(); |
| + builder.ElseDeopt(); |
| + } |
| + |
| + AddInstruction(new(zone()) HPushArgument(AddInstruction( |
| + new(zone()) HConstant(literals, Representation::Tagged())))); |
| + AddInstruction(new(zone()) HPushArgument(AddInstruction( |
| + new(zone()) HConstant(literal_index, Representation::Tagged())))); |
| + AddInstruction(new(zone()) HPushArgument(AddInstruction( |
| + new(zone()) HConstant(constants, Representation::Tagged())))); |
| + |
| + Runtime::FunctionId function_id = (expr->depth() > 1) |
| + ? Runtime::kCreateArrayLiteral : Runtime::kCreateArrayLiteralShallow; |
| literal = AddInstruction( |
| - new(zone()) HArrayLiteral(context, |
| - original_boilerplate_object, |
| - literals, |
| - length, |
| - expr->literal_index(), |
| - expr->depth(), |
| - mode)); |
| + new(zone()) HCallRuntime(context, |
| + isolate()->factory()->empty_string(), |
| + Runtime::FunctionForId(function_id), |
| + 3)); |
| } |
| // The array is expected in the bailout environment during computation |