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_; |
| }; |