Bug 1253424 - part 1 - add a already_AddRefed nsTransactionStack::Push overload; r=erahm

We unnecessarily refcount in several places when pushing items onto an
nsTransactionStack.  Adding an already_AddRefed overload will enable
avoid those unnecessary refcounts.
This commit is contained in:
Nathan Froyd 2016-03-03 16:04:25 -05:00
parent bd4c88439b
commit d422cbba4b
4 changed files with 23 additions and 6 deletions

View File

@ -237,7 +237,7 @@ nsTransactionItem::UndoChildren(nsTransactionManager *aTxMgr)
if (NS_SUCCEEDED(result)) {
item = mUndoStack->Pop();
mRedoStack->Push(item);
mRedoStack->Push(item.forget());
}
nsresult result2 = aTxMgr->DidUndoNotify(t, result);
@ -310,7 +310,7 @@ nsTransactionItem::RedoChildren(nsTransactionManager *aTxMgr)
if (NS_SUCCEEDED(result)) {
item = mRedoStack->Pop();
mUndoStack->Push(item);
mUndoStack->Push(item.forget());
}
nsresult result2 = aTxMgr->DidUndoNotify(t, result);

View File

@ -135,7 +135,7 @@ nsTransactionManager::UndoTransaction()
if (NS_SUCCEEDED(result)) {
tx = mUndoStack.Pop();
mRedoStack.Push(tx);
mRedoStack.Push(tx.forget());
}
nsresult result2 = DidUndoNotify(t, result);
@ -188,7 +188,7 @@ nsTransactionManager::RedoTransaction()
if (NS_SUCCEEDED(result)) {
tx = mRedoStack.Pop();
mUndoStack.Push(tx);
mUndoStack.Push(tx.forget());
}
nsresult result2 = DidRedoNotify(t, result);
@ -898,7 +898,7 @@ nsTransactionManager::EndTransaction(bool aAllowEmpty)
// Push the transaction on the undo stack:
mUndoStack.Push(tx);
mUndoStack.Push(tx.forget());
return NS_OK;
}

View File

@ -29,7 +29,23 @@ nsTransactionStack::Push(nsTransactionItem *aTransaction)
}
// The stack's bottom is the front of the deque, and the top is the back.
mDeque.push_back(aTransaction);
RefPtr<nsTransactionItem> item(aTransaction);
Push(item.forget());
}
void
nsTransactionStack::Push(already_AddRefed<nsTransactionItem> aTransaction)
{
RefPtr<nsTransactionItem> item(aTransaction);
if (!item) {
return;
}
// XXX we really want to use emplace_back here, but we don't have a
// C++11 stdlib everywhere.
RefPtr<nsTransactionItem> dummy;
auto pushedItem = mDeque.insert(mDeque.end(), dummy);
*pushedItem = item.forget();
}
already_AddRefed<nsTransactionItem>

View File

@ -21,6 +21,7 @@ public:
~nsTransactionStack();
void Push(nsTransactionItem *aTransactionItem);
void Push(already_AddRefed<nsTransactionItem> aTransactionItem);
already_AddRefed<nsTransactionItem> Pop();
already_AddRefed<nsTransactionItem> PopBottom();
already_AddRefed<nsTransactionItem> Peek();