Skip to content

Commit 3a092d3

Browse files
squelartwolfbeast
authored andcommitted
Bug 1332825 - Use move semantics in MozPromise::All() and AllPromiseHolder.
MozPromise::All sets up 'Then' lambdas on all sub-promises, each one taking the resolve/reject object by value. Since this value will not be used again in the lambda, it is safe to Move it, and from there MozPromiseHolder::Resolve/Reject can also Move it again into the holder storage, potentially saving two copies per Resolve/Reject. Also, once all sub-promises have been resolved, the resolve-values can be Move'd into the joining promise's Resolve function.
1 parent 15d1f65 commit 3a092d3

File tree

1 file changed

+8
-8
lines changed

1 file changed

+8
-8
lines changed

xpcom/threads/MozPromise.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -229,35 +229,35 @@ class MozPromise : public MozPromiseRefcountable
229229
mResolveValues.SetLength(aDependentPromises);
230230
}
231231

232-
void Resolve(size_t aIndex, const ResolveValueType& aResolveValue)
232+
void Resolve(size_t aIndex, ResolveValueType&& aResolveValue)
233233
{
234234
if (!mPromise) {
235235
// Already rejected.
236236
return;
237237
}
238238

239-
mResolveValues[aIndex].emplace(aResolveValue);
239+
mResolveValues[aIndex].emplace(Move(aResolveValue));
240240
if (--mOutstandingPromises == 0) {
241241
nsTArray<ResolveValueType> resolveValues;
242242
resolveValues.SetCapacity(mResolveValues.Length());
243243
for (size_t i = 0; i < mResolveValues.Length(); ++i) {
244-
resolveValues.AppendElement(mResolveValues[i].ref());
244+
resolveValues.AppendElement(Move(mResolveValues[i].ref()));
245245
}
246246

247-
mPromise->Resolve(resolveValues, __func__);
247+
mPromise->Resolve(Move(resolveValues), __func__);
248248
mPromise = nullptr;
249249
mResolveValues.Clear();
250250
}
251251
}
252252

253-
void Reject(const RejectValueType& aRejectValue)
253+
void Reject(RejectValueType&& aRejectValue)
254254
{
255255
if (!mPromise) {
256256
// Already rejected.
257257
return;
258258
}
259259

260-
mPromise->Reject(aRejectValue, __func__);
260+
mPromise->Reject(Move(aRejectValue), __func__);
261261
mPromise = nullptr;
262262
mResolveValues.Clear();
263263
}
@@ -276,8 +276,8 @@ class MozPromise : public MozPromiseRefcountable
276276
RefPtr<AllPromiseHolder> holder = new AllPromiseHolder(aPromises.Length());
277277
for (size_t i = 0; i < aPromises.Length(); ++i) {
278278
aPromises[i]->Then(aProcessingThread, __func__,
279-
[holder, i] (ResolveValueType aResolveValue) -> void { holder->Resolve(i, aResolveValue); },
280-
[holder] (RejectValueType aRejectValue) -> void { holder->Reject(aRejectValue); }
279+
[holder, i] (ResolveValueType aResolveValue) -> void { holder->Resolve(i, Move(aResolveValue)); },
280+
[holder] (RejectValueType aRejectValue) -> void { holder->Reject(Move(aRejectValue)); }
281281
);
282282
}
283283
return holder->Promise();

0 commit comments

Comments
 (0)