| Index: src/code-stubs-hydrogen.cc
|
| diff --git a/src/code-stubs-hydrogen.cc b/src/code-stubs-hydrogen.cc
|
| index 19b6088dd1d0db00e348fdf5cab3773002eb6e66..3232a74cc34cb5f960fdbf89b8ddb0edc54d2be4 100644
|
| --- a/src/code-stubs-hydrogen.cc
|
| +++ b/src/code-stubs-hydrogen.cc
|
| @@ -721,15 +721,23 @@ HValue* CodeStubGraphBuilderBase::BuildArraySingleArgumentConstructor(
|
|
|
| HValue* CodeStubGraphBuilderBase::BuildArrayNArgumentsConstructor(
|
| JSArrayBuilder* array_builder, ElementsKind kind) {
|
| + // Insert a bounds check because the number of arguments might exceed
|
| + // the kInitialMaxFastElementArray limit. This cannot happen for code
|
| + // that was parsed, but calling via Array.apply(thisArg, [...]) might
|
| + // trigger it.
|
| + HValue* length = GetArgumentsLength();
|
| + HConstant* max_alloc_length =
|
| + Add<HConstant>(JSObject::kInitialMaxFastElementArray);
|
| + HValue* checked_length = Add<HBoundsCheck>(length, max_alloc_length);
|
| +
|
| // We need to fill with the hole if it's a smi array in the multi-argument
|
| // case because we might have to bail out while copying arguments into
|
| // the array because they aren't compatible with a smi array.
|
| // If it's a double array, no problem, and if it's fast then no
|
| // problem either because doubles are boxed.
|
| - HValue* length = GetArgumentsLength();
|
| bool fill_with_hole = IsFastSmiElementsKind(kind);
|
| - HValue* new_object = array_builder->AllocateArray(length,
|
| - length,
|
| + HValue* new_object = array_builder->AllocateArray(checked_length,
|
| + checked_length,
|
| fill_with_hole);
|
| HValue* elements = array_builder->GetElementsLocation();
|
| ASSERT(elements != NULL);
|
| @@ -739,10 +747,10 @@ HValue* CodeStubGraphBuilderBase::BuildArrayNArgumentsConstructor(
|
| context(),
|
| LoopBuilder::kPostIncrement);
|
| HValue* start = graph()->GetConstant0();
|
| - HValue* key = builder.BeginBody(start, length, Token::LT);
|
| + HValue* key = builder.BeginBody(start, checked_length, Token::LT);
|
| HInstruction* argument_elements = Add<HArgumentsElements>(false);
|
| HInstruction* argument = Add<HAccessArgumentsAt>(
|
| - argument_elements, length, key);
|
| + argument_elements, checked_length, key);
|
|
|
| Add<HStoreKeyed>(elements, key, argument, kind);
|
| builder.EndBody();
|
|
|