Bug 1310744: Allow MoveBoxedOrUnboxedDenseElements to bail out if the elements are frozen. r?nbp draft
authorEmilio Cobos Álvarez <ecoal95@gmail.com>
Wed, 19 Oct 2016 20:34:38 +0200
changeset 427480 e7a73368994ca6d5c9a4082090f37c3d6d17fc24
parent 427479 3c107e47d50553d7430bfa3158a9e9daf8f5be6e
child 427481 08b9a25cfe4056205de969de90394733b6d75ef8
push id33026
push userbmo:ecoal95@gmail.com
push dateThu, 20 Oct 2016 12:41:55 +0000
reviewersnbp
bugs1310744
milestone52.0a1
Bug 1310744: Allow MoveBoxedOrUnboxedDenseElements to bail out if the elements are frozen. r?nbp MozReview-Commit-ID: EXhw8FkcNnu
js/src/jsarray.cpp
js/src/vm/UnboxedObject-inl.h
--- a/js/src/jsarray.cpp
+++ b/js/src/jsarray.cpp
@@ -2198,19 +2198,18 @@ ArrayShiftDenseKernel(JSContext* cx, Han
     if (initlen == 0)
         return DenseElementResult::Incomplete;
 
     rval.set(GetBoxedOrUnboxedDenseElement<Type>(obj, 0));
     if (rval.isMagic(JS_ELEMENTS_HOLE))
         rval.setUndefined();
 
     DenseElementResult result = MoveBoxedOrUnboxedDenseElements<Type>(cx, obj, 0, 1, initlen - 1);
-    MOZ_ASSERT(result != DenseElementResult::Incomplete);
-    if (result == DenseElementResult::Failure)
-        return DenseElementResult::Failure;
+    if (result != DenseElementResult::Success)
+        return result;
 
     SetBoxedOrUnboxedInitializedLength<Type>(cx, obj, initlen - 1);
     return DenseElementResult::Success;
 }
 
 DefineBoxedOrUnboxedFunctor3(ArrayShiftDenseKernel,
                              JSContext*, HandleObject, MutableHandleValue);
 
--- a/js/src/vm/UnboxedObject-inl.h
+++ b/js/src/vm/UnboxedObject-inl.h
@@ -556,16 +556,19 @@ SetOrExtendBoxedOrUnboxedDenseElements(E
 template <JSValueType Type>
 static inline DenseElementResult
 MoveBoxedOrUnboxedDenseElements(JSContext* cx, JSObject* obj, uint32_t dstStart, uint32_t srcStart,
                                 uint32_t length)
 {
     MOZ_ASSERT(HasBoxedOrUnboxedDenseElements<Type>(obj));
 
     if (Type == JSVAL_TYPE_MAGIC) {
+        if (obj->as<NativeObject>().denseElementsAreFrozen())
+            return DenseElementResult::Incomplete;
+
         if (!obj->as<NativeObject>().maybeCopyElementsForWrite(cx))
             return DenseElementResult::Failure;
         obj->as<NativeObject>().moveDenseElements(dstStart, srcStart, length);
     } else {
         uint8_t* data = obj->as<UnboxedArrayObject>().elements();
         size_t elementSize = UnboxedTypeSize(Type);
 
         if (UnboxedTypeNeedsPreBarrier(Type) &&