Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index 84429778b58a98e4fc7a215dc94a4484c7f99093..80ae0d835fb8c34996443e3b3c21d124f674bd86 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -2326,6 +2326,8 @@ Object* JSObject::DeleteElementPostInterceptor(uint32_t index, |
ASSERT(!HasPixelElements() && !HasExternalArrayElements()); |
switch (GetElementsKind()) { |
case FAST_ELEMENTS: { |
+ Object* obj = EnsureWritableFastElements(); |
+ if (obj->IsFailure()) return obj; |
uint32_t length = IsJSArray() ? |
static_cast<uint32_t>(Smi::cast(JSArray::cast(this)->length())->value()) : |
static_cast<uint32_t>(FixedArray::cast(elements())->length()); |
@@ -2406,6 +2408,8 @@ Object* JSObject::DeleteElement(uint32_t index, DeleteMode mode) { |
switch (GetElementsKind()) { |
case FAST_ELEMENTS: { |
+ Object* obj = EnsureWritableFastElements(); |
+ if (obj->IsFailure()) return obj; |
uint32_t length = IsJSArray() ? |
static_cast<uint32_t>(Smi::cast(JSArray::cast(this)->length())->value()) : |
static_cast<uint32_t>(FixedArray::cast(elements())->length()); |
@@ -4997,8 +5001,8 @@ void Map::ClearNonLiveTransitions(Object* real_prototype) { |
ASSERT(target->IsHeapObject()); |
if (!target->IsMarked()) { |
ASSERT(target->IsMap()); |
- contents->set(i + 1, NullDescriptorDetails); |
- contents->set_null(i); |
+ contents->set_unchecked(i + 1, NullDescriptorDetails); |
+ contents->set_null_unchecked(i); |
ASSERT(target->prototype() == this || |
target->prototype() == real_prototype); |
// Getter prototype() is read-only, set_prototype() has side effects. |
@@ -5579,6 +5583,8 @@ Object* JSObject::SetElementsLength(Object* len) { |
int old_capacity = FixedArray::cast(elements())->length(); |
if (value <= old_capacity) { |
if (IsJSArray()) { |
+ Object* obj = EnsureWritableFastElements(); |
+ if (obj->IsFailure()) return obj; |
int old_length = FastD2I(JSArray::cast(this)->length()->Number()); |
// NOTE: We may be able to optimize this by removing the |
// last part of the elements backing storage array and |
@@ -6044,7 +6050,9 @@ Object* JSObject::SetElementWithCallback(Object* structure, |
Object* JSObject::SetFastElement(uint32_t index, Object* value) { |
ASSERT(HasFastElements()); |
- FixedArray* elms = FixedArray::cast(elements()); |
+ Object* elms_obj = EnsureWritableFastElements(); |
+ if (elms_obj->IsFailure()) return elms_obj; |
+ FixedArray* elms = FixedArray::cast(elms_obj); |
uint32_t elms_length = static_cast<uint32_t>(elms->length()); |
if (!IsJSArray() && (index >= elms_length || elms->get(index)->IsTheHole())) { |
@@ -6088,6 +6096,7 @@ Object* JSObject::SetFastElement(uint32_t index, Object* value) { |
return SetElement(index, value); |
} |
+ |
Object* JSObject::SetElement(uint32_t index, Object* value) { |
// Check access rights if needed. |
if (IsAccessCheckNeeded() && |
@@ -7566,6 +7575,9 @@ Object* JSObject::PrepareElementsForSort(uint32_t limit) { |
set_map(new_map); |
set_elements(fast_elements); |
+ } else { |
+ Object* obj = EnsureWritableFastElements(); |
+ if (obj->IsFailure()) return obj; |
} |
ASSERT(HasFastElements()); |