Index: src/elements.cc |
diff --git a/src/elements.cc b/src/elements.cc |
index fc0f3b8f43ebfdb243d2dc58e2f093680a6ebbec..3ef6bfd0e1130920d885831d50a00b838173a13d 100644 |
--- a/src/elements.cc |
+++ b/src/elements.cc |
@@ -897,7 +897,8 @@ class FastElementsAccessor |
typedef typename KindTraits::BackingStore BackingStore; |
- // Adjusts the length of the fast backing store.. |
+ // Adjusts the length of the fast backing store or returns the new length or |
+ // undefined in case conversion to a slow backing store should be performed. |
static Handle<Object> SetLengthWithoutNormalize( |
Handle<FixedArrayBase> backing_store, |
Handle<JSArray> array, |
@@ -949,10 +950,15 @@ class FastElementsAccessor |
// Check whether the backing store should be expanded. |
uint32_t min = JSObject::NewElementsCapacity(old_capacity); |
uint32_t new_capacity = length > min ? length : min; |
- FastElementsAccessorSubclass::SetFastElementsCapacityAndLength( |
- array, new_capacity, length); |
- JSObject::ValidateElements(array); |
- return length_object; |
+ if (!array->ShouldConvertToSlowElements(new_capacity)) { |
+ FastElementsAccessorSubclass::SetFastElementsCapacityAndLength( |
+ array, new_capacity, length); |
+ JSObject::ValidateElements(array); |
+ return length_object; |
+ } |
+ |
+ // Request conversion to slow elements. |
+ return isolate->factory()->undefined_value(); |
} |
static Handle<Object> DeleteCommon(Handle<JSObject> obj, |