Chromium Code Reviews| Index: src/runtime.cc | 
| diff --git a/src/runtime.cc b/src/runtime.cc | 
| index 5fe1f9dc5bcb33a93581e2f2ed100d58cfe5c5f0..7f0d38f7e1b4f9eda62885cf4f403dcdadfa4219 100644 | 
| --- a/src/runtime.cc | 
| +++ b/src/runtime.cc | 
| @@ -8962,14 +8962,18 @@ class ArrayConcatVisitor { | 
| storage_(Handle<FixedArray>::cast( | 
| isolate->global_handles()->Create(*storage))), | 
| index_offset_(0u), | 
| - fast_elements_(fast_elements) { } | 
| + fast_elements_(fast_elements), | 
| + exceeds_array_limit_(false) { } | 
| ~ArrayConcatVisitor() { | 
| clear_storage(); | 
| } | 
| void visit(uint32_t i, Handle<Object> elm) { | 
| - if (i >= JSObject::kMaxElementCount - index_offset_) return; | 
| + if (i >= JSObject::kMaxElementCount - index_offset_) { | 
| 
 
Toon Verwaest
2013/04/04 12:52:24
Seems like an off-by-one error.
What about index_o
 
 | 
| + exceeds_array_limit_ = true; | 
| + return; | 
| + } | 
| uint32_t index = index_offset_ + i; | 
| if (fast_elements_) { | 
| @@ -9004,7 +9008,12 @@ class ArrayConcatVisitor { | 
| } | 
| } | 
| - Handle<JSArray> ToArray() { | 
| + Handle<Object> ToArray() { | 
| + if (exceeds_array_limit_) { | 
| + // Index exceeds the array size limit, so that elements would be stored | 
| + // as properties are missing. | 
| + return Handle<Smi>(Smi::FromInt(0), isolate_); | 
| + } | 
| Handle<JSArray> array = isolate_->factory()->NewJSArray(0); | 
| Handle<Object> length = | 
| isolate_->factory()->NewNumber(static_cast<double>(index_offset_)); | 
| @@ -9063,6 +9072,7 @@ class ArrayConcatVisitor { | 
| // JSObject::kMaxElementCount. | 
| uint32_t index_offset_; | 
| bool fast_elements_; | 
| + bool exceeds_array_limit_; | 
| }; |