| Index: src/runtime.cc
|
| ===================================================================
|
| --- src/runtime.cc (revision 631)
|
| +++ src/runtime.cc (working copy)
|
| @@ -4128,16 +4128,17 @@
|
| /**
|
| * A helper function of Runtime_ArrayConcat.
|
| *
|
| - * The first argument is an Array of Arrays and objects. It is the same as
|
| - * the arguments array of Array::concat JS function.
|
| + * The first argument is an Array of arrays and objects. It is the
|
| + * same as the arguments array of Array::concat JS function.
|
| *
|
| - * If an argument is an Array object, the function visits array elements.
|
| - * If an argument is not an Array object, the function visits the object
|
| - * as if it is an one-element array.
|
| + * If an argument is an Array object, the function visits array
|
| + * elements. If an argument is not an Array object, the function
|
| + * visits the object as if it is an one-element array.
|
| *
|
| - * If the result array index overflows 32-bit integer, the rounded non-negative
|
| - * number is used as new length. For example, if one array length is 2^32 - 1,
|
| - * second array length is 1, the concatenated array length is 0.
|
| + * If the result array index overflows 32-bit integer, the rounded
|
| + * non-negative number is used as new length. For example, if one
|
| + * array length is 2^32 - 1, second array length is 1, the
|
| + * concatenated array length is 0.
|
| */
|
| static uint32_t IterateArguments(Handle<JSArray> arguments,
|
| ArrayConcatVisitor* visitor) {
|
| @@ -4201,13 +4202,16 @@
|
| Handle<JSArray> result = Factory::NewJSArray(0);
|
|
|
| uint32_t estimate_nof_elements = IterateArguments(arguments, NULL);
|
| - // If estimated number of elements is more than half of length,
|
| - // A fixed array (fast case) is more time & space-efficient than a dictionary.
|
| + // If estimated number of elements is more than half of length, a
|
| + // fixed array (fast case) is more time and space-efficient than a
|
| + // dictionary.
|
| bool fast_case = (estimate_nof_elements * 2) >= result_length;
|
|
|
| Handle<FixedArray> storage;
|
| if (fast_case) {
|
| - storage = Factory::NewFixedArray(result_length);
|
| + // The backing storage array must have non-existing elements to
|
| + // preserve holes across concat operations.
|
| + storage = Factory::NewFixedArrayWithHoles(result_length);
|
|
|
| } else {
|
| // TODO(126): move 25% pre-allocation logic into Dictionary::Allocate
|
|
|