| Index: src/runtime.cc
|
| diff --git a/src/runtime.cc b/src/runtime.cc
|
| index 1fbedc6adc3cad719a24976e9929a0e686fca682..5f56953192cb5765e26f02895d28e6620b2d2bdc 100644
|
| --- a/src/runtime.cc
|
| +++ b/src/runtime.cc
|
| @@ -10541,10 +10541,10 @@ RUNTIME_FUNCTION(Runtime_ArrayConcat) {
|
| Handle<FixedArrayBase> storage =
|
| isolate->factory()->NewFixedDoubleArray(estimate_result_length);
|
| int j = 0;
|
| + bool failure = false;
|
| if (estimate_result_length > 0) {
|
| Handle<FixedDoubleArray> double_storage =
|
| Handle<FixedDoubleArray>::cast(storage);
|
| - bool failure = false;
|
| for (int i = 0; i < argument_count; i++) {
|
| Handle<Object> obj(elements->get(i), isolate);
|
| if (obj->IsSmi()) {
|
| @@ -10565,6 +10565,11 @@ RUNTIME_FUNCTION(Runtime_ArrayConcat) {
|
| FixedDoubleArray::cast(array->elements());
|
| for (uint32_t i = 0; i < length; i++) {
|
| if (elements->is_the_hole(i)) {
|
| + // TODO(jkummerow/verwaest): We could be a bit more clever
|
| + // here: Check if there are no elements/getters on the
|
| + // prototype chain, and if so, allow creation of a holey
|
| + // result array.
|
| + // Same thing below (holey smi case).
|
| failure = true;
|
| break;
|
| }
|
| @@ -10591,6 +10596,7 @@ RUNTIME_FUNCTION(Runtime_ArrayConcat) {
|
| break;
|
| }
|
| case FAST_HOLEY_ELEMENTS:
|
| + case FAST_ELEMENTS:
|
| DCHECK_EQ(0, length);
|
| break;
|
| default:
|
| @@ -10600,14 +10606,17 @@ RUNTIME_FUNCTION(Runtime_ArrayConcat) {
|
| if (failure) break;
|
| }
|
| }
|
| - Handle<JSArray> array = isolate->factory()->NewJSArray(0);
|
| - Smi* length = Smi::FromInt(j);
|
| - Handle<Map> map;
|
| - map = JSObject::GetElementsTransitionMap(array, kind);
|
| - array->set_map(*map);
|
| - array->set_length(length);
|
| - array->set_elements(*storage);
|
| - return *array;
|
| + if (!failure) {
|
| + Handle<JSArray> array = isolate->factory()->NewJSArray(0);
|
| + Smi* length = Smi::FromInt(j);
|
| + Handle<Map> map;
|
| + map = JSObject::GetElementsTransitionMap(array, kind);
|
| + array->set_map(*map);
|
| + array->set_length(length);
|
| + array->set_elements(*storage);
|
| + return *array;
|
| + }
|
| + // In case of failure, fall through.
|
| }
|
|
|
| Handle<FixedArray> storage;
|
|
|