diff --git a/js/src/vm/Interpreter.cpp b/js/src/vm/Interpreter.cpp index bc7820c3cf14..39cee4944572 100644 --- a/js/src/vm/Interpreter.cpp +++ b/js/src/vm/Interpreter.cpp @@ -1500,8 +1500,19 @@ SetObjectElementOperation(JSContext* cx, HandleObject obj, HandleId id, HandleVa } } - if (obj->isNative() && !JSID_IS_INT(id) && !JSObject::setHadElementsAccess(cx, obj)) - return false; + // Set the HadElementsAccess flag on the object if needed. This flag is + // used to do more eager dictionary-mode conversion for objects that are + // used as hashmaps. Set this flag only for objects with many properties, + // to avoid unnecessary Shape changes. + if (obj->isNative() && + JSID_IS_ATOM(id) && + !obj->as().inDictionaryMode() && + !obj->hadElementsAccess() && + obj->as().slotSpan() > PropertyTree::MAX_HEIGHT_WITH_ELEMENTS_ACCESS / 3) + { + if (!JSObject::setHadElementsAccess(cx, obj)) + return false; + } ObjectOpResult result; return SetProperty(cx, obj, id, value, receiver, result) &&