Index: src/ic/keyed-store-generic.cc |
diff --git a/src/ic/keyed-store-generic.cc b/src/ic/keyed-store-generic.cc |
index cf1c49f0c897304788c7134572b5413eb062fa05..33ac58fafb6eae885290f542da4d778af5c2b1d7 100644 |
--- a/src/ic/keyed-store-generic.cc |
+++ b/src/ic/keyed-store-generic.cc |
@@ -225,6 +225,15 @@ void KeyedStoreGenericAssembler::StoreElementWithCapacity( |
if (update_length != kDontChangeLength) { |
CSA_ASSERT(this, Word32Equal(LoadMapInstanceType(receiver_map), |
Int32Constant(JS_ARRAY_TYPE))); |
+ // Check if the length property is writable. The fast check is only |
+ // supported for fast properties. |
+ GotoIf(IsDictionaryMap(receiver_map), slow); |
+ // The length property is non-configurable, so it's guaranteed to always |
+ // be the first property. |
+ Node* descriptors = LoadMapDescriptors(receiver_map); |
+ Node* details = |
+ LoadFixedArrayElement(descriptors, DescriptorArray::ToDetailsIndex(0)); |
+ GotoIf(IsSetSmi(details, PropertyDetails::kAttributesReadOnlyMask), slow); |
} |
STATIC_ASSERT(FixedArray::kHeaderSize == FixedDoubleArray::kHeaderSize); |
const int kHeaderSize = FixedArray::kHeaderSize - kHeapObjectTag; |